美文网首页
进程管理

进程管理

作者: FlySheep_ly | 来源:发表于2017-09-21 18:07 被阅读41次

    一、进程的查看

    1、将某个时间点的进程运行情况选取下来:ps

    [root@www ~]# ps aux  <==查看系统所有的进程数据
    [root@www ~]# ps -lA   <==也是能够查看所有系统的数据
    [root@www ~]# ps axjf  <==连同部分进程树状态
    参数:
    -A  :所有的进程均显示出来
    -a  :不与 terminal 有关的所有进程
    -u  :有效用户相关的进程
    x   :通常与 a 这个参数一起使用,可列出较完整信息
    输出格式规划:
    l   :较长、较详细地将该 PID 的信息列出
    j   :工作的格式
    -f  :做一个更为完整的输出
    

    2、仅查看自己的 bash 相关进程:ps -l

    范例一:将目前属于你自己这次登录的 PID 与相关信息列出来
    [root@www ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0 22186 22184  0  80   0 - 29175 wait   pts/6    00:00:00 bash
    0 R     0 22826 22186  0  80   0 - 37232 -      pts/6    00:00:00 ps
    

    每一列的含义:
      F:代表这个进程标志,说明这个进程的权限,常见值有:

    • 若为4表示此进程的权限为 root;
    • 若为1表示此子进程仅可进行复制而无法实际执行。

    S:代表这个进程的状态,主要的状态有:

    • R(Running):该进程正在运行中;
    • S(Sleep):该进程目前正在睡眠状态,但可以被唤醒;
    • D:不可被唤醒的睡眠状态,通常这个进程可能在等待 I/O 的情况;
    • T:停止状态,可能是在工作控制(后台暂停)或排除状态;
    • Z(Zombie):“僵尸”状态,进程已经终止但却无法被删除至内存外。

    UID/PID/PPID:代表此进程被该 UID 所拥有/进程的 PID 号码/此进程的父进程 PID 号码。
      C:代表 CPU 使用率,单位为百分比
      PRI/NI:Priority/Nice 的缩写,代表此进程被 CPU 所执行的优先级,数值越小代表该进程越快被 CPU 执行。
      ADDR/SZ/WCHAN:都与内存有关,ADDR 指出该进程在内存的哪个部分,如果是个 running 的进程,一般就会显示“-”。SZ 代表此进程用掉多少内存。WCHAN 表示目前进程是否运行中,若为“-”表示正在运行中。
      TTY:登录者的终端机位置,若为远程登录则使用动态终端接口(pts/n)。
      TIME:使用掉的 CPU 时间。注意,是此进程实际花费 CPU 运行的时间,而不是系统时间。
      CMD:就是 COMMAND 的缩写,造成此程序的触发进程的命令为何。

    3、查看系统所有进程:ps aux

    范例二:列出目前所有的正在内存当中的进程
    [root@www ~]# ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0 189684  3680 ?        Ss   9月11   0:30 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
    root         2  0.0  0.0      0     0 ?        S    9月11   0:00 [kthreadd]
    root         3  0.0  0.0      0     0 ?        S    9月11   0:04 [ksoftirqd/0]
    root         5  0.0  0.0      0     0 ?        S<   9月11   0:00 [kworker/0:0H]
    

    各字段的含义:
      USER:该进程属于哪个用户账号的;
      PID :该进程的进程标识符;
      %CPU:该进程使用掉的 CPU 资源百分比;
      %MEM:该进程所占用的物理内存百分比;
      VSZ :该进程使用掉的虚拟内存量 (KB);
      RSS :该进程占用的固定的内存量 (KB);
      TTY :该进程是在哪个终端机上面运作,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登
    入者进程,若为 pts/0 等等的,则表示为由网络连接进主机的进程;
      STAT:该进程目前的状态,状态显示与 ps -l 的 S 标识相同 (R/S/T/Z);
      START:该进程被触发启动的时间;
      TIME:该进程实际使用 CPU 运作的时间。
      COMMAND:该进程的实际命令。

    4、范例四:列出类似进程树的进程显示

    [root@www logs]# ps axjf
     PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
        1  5055  4996  4996 ?           -1 Sl       0   0:00 /usr/libexec/imsettings-daemon
     5055  5657  5657  4996 ?           -1 Sl       0   0:00  \_ /usr/bin/ibus-daemon -r --xim
     5657  5667  5657  4996 ?           -1 Sl       0   0:00      \_ /usr/libexec/ibus-dconf
     5657  5668  5657  4996 ?           -1 Sl       0   0:00      \_ /usr/libexec/ibus-ui-gtk3
     5657  5709  5657  4996 ?           -1 Sl       0   0:00      \_ /usr/libexec/ibus-engine-simple
    

    5、范例五:找出 cron 这个服务有关的 PID

    [root@www logs]# ps aux|grep cron
    root      1272  0.0  0.0 124140  1544 ?        Ss   9月11   0:02 /usr/sbin/crond -n
    root     25575  0.0  0.0 112668   972 pts/6    S+   16:51   0:00 grep --color=auto cron
    

    6、僵尸进程

    通常,造成僵尸进程的成因是因为该进程应该已经执行完毕,或者是因故应该要终止了,但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中。 如果你发现在某个进程的 CMD 后面还接上 <defunct> 时,就代表该进程是僵尸进程。

     apache 8683 0.0 0.9 83384 9992 ? Z 14:33 0:00 /usr/sbin/httpd <defunct>
    

    当系统不稳定的时候就容易造成所谓的僵尸进程,可能是因为程序写的不好啦,或者是使用者的操作习惯不良等等所造成。 如果你发现系统中很多僵尸进程时,记得要找出该进程的父进程, 然后好好的做个追踪,好好的进行主机的环境优化! 看看有什么地方需要改善的,不要只是直接将他 kill 掉而已!不然的话,万一他一直产生,那可就麻烦了!

    7、动态观察进程的变化:top

    相对于 ps 是撷取一个时间点的进程状态, top 则可以持续侦测进程运作的状态!使用方式如下:

    top [-d 数字] | top [-bnp]
    选项与参数:
    -d :后面可以接秒数,就是整个进程画面更新的秒数。预设是 5 秒;
    -b :以批次的方式执行 top ,通常会搭配数据流重导向来将批次的结果输出成为文件。
    -n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
    -p :指定某些个 PID 来进行观察监测而已。
    在 top 执行过程当中可以使用的按键指令:
    ? :显示在 top 当中可以输入的按键指令;
    P :以 CPU 的使用资源排序显示;
    M :以 Memory 的使用资源排序显示;
    N :以 PID 来排序;
    T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序;
    k :给予某个 PID 一个讯号 (signal);
    r :给予某个 PID 重新制订一个 nice 值;
    q:离开 top 软件的按键。
    

    8、每两秒钟更新一次 top ,观察整体信息

    [root@www logs]# top -d 2
    top - 17:03:55 up 10 days,  3:48,  2 users,  load average: 1.57, 1.91, 2.30
    Tasks: 435 total,   1 running, 432 sleeping,   2 stopped,   0 zombie
    %Cpu(s): 27.4 us,  1.8 sy,  0.0 ni, 70.1 id,  0.5 wa,  0.0 hi,  0.1 si,  0.0 st
    KiB Mem : 32766052 total,   403500 free, 25129012 used,  7233540 buff/cache
    KiB Swap: 32767996 total, 30989396 free,  1778600 used.  6801196 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                
     5839 qemu      20   0 5410284 3.877g   6320 S 371.8 12.4   6602:11 qemu-kvm                                                               
     5938 qemu      20   0 5413356 3.808g   6308 S  39.1 12.2   7835:59 qemu-kvm 
    

    top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行, 显示的内容依序是:
      第一行(top...):这一行显示的信息分别为:

    • 目前的时间,亦即是 17:03:55 那个项目;
    • 开机到目前为止所经过的时间,亦即是 up 10 days, 那个项目;
    • 已经登入系统的用户人数,亦即是 2 users, 项目;
    • 系统在 1, 5, 15 分钟的平均工作负载。越小代表系统越闲置,若高于 1 得要注意你的系统进程是否太过繁复了!

    第二行(Tasks...):显示的是目前进程的总量与个别进程在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值,如果不是 0 好好看看到底是那个 process 变成僵尸了吧。
      第三行(%Cpus...):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 wa 项目,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目 耗用 CPU 的资源喔!另外,如果是多核心的设备,可以按下数字键『1』来切换成不同 CPU 的负载率。
      第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重申,要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理内存实在不足!
      第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。
      至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:
      PID :每个 process 的 ID 啦!
      USER:该 process 所属的使用者;
      PR :Priority 的简写,进程的优先执行顺序,越小越早被执行;
      NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
      %CPU:CPU 的使用率;
      %MEM:内存的使用率;
      TIME+:CPU 使用时间的累加;

    9、将 top 的信息进行 2 次,然后将结果输出到 /tmp/top.txt

    [root@www logs]# top -b -n 2 > /tmp/top.txt
    

    10、我们自己的 bash PID 可由 $$ 变量取得,请使用 top 持续观察该 PID

    [root@www logs]# echo $$
    22186
    
    [root@www logs]# top -p 22186
    top - 17:18:08 up 10 days,  4:02,  2 users,  load average: 1.30, 2.20, 2.34
    Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  3.9 us,  1.5 sy,  0.0 ni, 93.6 id,  1.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem : 32766052 total,   370620 free, 25120868 used,  7274564 buff/cache
    KiB Swap: 32767996 total, 30989516 free,  1778480 used.  6801012 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                
    22186 root      20   0  116924   3660   1852 S   0.0  0.0   0:00.74 bash                                                                   
    
    

    11、pstree

    pstree [-A|U] [-up]
    选项与参数:
    -A :各进程树之间的连接以 ASCII 字符来连接;
    -U :各进程树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
    -p :并同时列出每个 process 的 PID;
    -u :并同时列出每个 process 的所属账号名称。
    
    范例一:列出目前系统上面所有的进程树的相关性
    [root@www ~]# pstree -A
    systemd-+-ModemManager---2*[{ModemManager}]  # 前面有数字,代表子进程的数量!
            |-NetworkManager---2*[{NetworkManager}]
            |-2*[Xvnc---16*[{Xvnc}]]
            |-2*[abrt-watch-log]
            |-abrtd
            |-accounts-daemon---2*[{accounts-daemon}]
            |-agetty
            |-alsactl
            |-2*[at-spi-bus-laun-+-dbus-daemon]
            |                    `-3*[{at-spi-bus-laun}]]
            |-2*[at-spi2-registr---2*[{at-spi2-registr}]]
            |-atd
    
    范例二:承上题,同时秀出 PID 与 users
    [root@www ~]# pstree -Aup 
    systemd(1)-+-ModemManager(834)-+-{ModemManager}(867)
               |                   `-{ModemManager}(870)
               |-NetworkManager(856)-+-{NetworkManager}(880)
               |                     `-{NetworkManager}(882)
               |-Xvnc(4048)-+-{Xvnc}(4049)
               |            |-{Xvnc}(4050)
               |            |-{Xvnc}(4051)
               |            |-{Xvnc}(4052)
               |            |-{Xvnc}(4053)
               |            |-{Xvnc}(4054)
               |            |-{Xvnc}(4055)
               |            |-{Xvnc}(4056)
               |            |-{Xvnc}(4057)
               |            |-{Xvnc}(4058)
               |            |-{Xvnc}(4059)
               |            |-{Xvnc}(4060)
               |            |-{Xvnc}(4061)
               |            |-{Xvnc}(4062)
               |            |-{Xvnc}(4063)
               |            `-{Xvnc}(4064)
               |-Xvnc(4965)-+-{Xvnc}(4966)
               |            |-{Xvnc}(4967)
    # 在括号 () 内的即是 PID 以及该进程的 owner 喔!一般来说,如果该进程的所有人与父进程同,
    # 就不会列出,但是如果与父进程不一样,那就会列出该进程的拥有者!
    

    二、系统资源的观察

    1、观察内存使用情况:free

    free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
    选项与参数:
    -b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)
    k(Kbytes), 及 g(Gbytes) 来显示单位喔!也可以直接让系统自己指定单位 (-h) 
    -t :在输出的最终结果,显示物理内存与 swap 的总量。
    -s :可以让系统每几秒钟输出一次,不间断的一直输出的意思!对于系统观察挺有效! 
    -c :与 -s 同时处理~让 free 列出几次的意思~
    
    范例一:显示目前系统的内存容量
    [root@www ~]# free -h
                  total        used        free      shared  buff/cache   available
    Mem:            31G         23G        271M         58M        7.0G        6.4G
    Swap:           31G        1.7G         29G
    

    2、查阅系统与核心相关信息:uname

    uname [-asrmpi]
    选项与参数:
    -a :所有系统相关的信息,包括底下的数据都会被列出来; 
    -s :系统核心名称
    -r :核心的版本
    -m :本系统的硬件名称,例如 i686 或 x86_64 等;
    -p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型! 
    -i :硬件的平台 (ix86)
    
    范例一:输出系统的基本信息
    [root@www ~]# uname -a
    Linux www 3.10.0-327.36.2.el7.x86_64 #1 SMP Mon Oct 10 23:08:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    说明我的 Linux 主机使用的核心名称为 Linux,而主机名为 www,核心的版本为 3.10.0-327.36.2.el7.x86_64,该核心版本建立的日期为 2016-8-10, 适用的硬件平台为 x86_64 以上等级的硬件平台喔。
    

    3、追踪网络或插槽文件:netstat

    netstat -[atunlp]
    选项与参数:
    -a :将目前系统上所有的联机、监听、Socket 数据都列出来 
    -t :列出 tcp 网络封包的数据
    -u :列出 udp 网络封包的数据
    -n :不以进程的服务名称,以埠号 (port number) 来显示;
    -l :列出目前正在网络监听 (listen) 的服务;
    -p :列出该网络服务的进程 PID
    
    范例一:列出目前系统已经建立的网络联机与 unix socket 状态
    [root@www ~]# netstat
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 Getui03:ssh             192.168.2.227:62054     ESTABLISHED
    tcp        0      0 Getui03:ssh             192.168.8.183:53389     ESTABLISHED
    tcp        0      0 Getui03:64346           Getui04:cslistener      ESTABLISHED
    tcp6       0      0 Getui03:10096           192.168.10.41:mysql     ESTABLISHED
    tcp6       1      0 Getui03:60200           192.168.10.:csoftragent CLOSE_WAIT 
    tcp6       1      0 Getui03:9225            192.168.10.:csoftragent CLOSE_WAIT 
    tcp6       1      0 Getui03:22824           192.168.10.91:6080      CLOSE_WAIT 
    tcp6       1      0 Getui03:palace-4        192.168.10.:csoftragent CLOSE_WAIT 
    tcp6       1      0 Getui03:51807           192.168.10.90:ii-admin  CLOSE_WAIT 
    

    4、侦测系统资源变化:vmstat

    vmstat [-a] [延迟 [总计侦测次数]]     <==CPU/内存等信息
    vmstat [-fs]                                       <==内存相关
    vmstat [-S 单位]                               <==设定显示数据的单位
    vmstat [-d]                                        <==与磁盘有关
    vmstat [-p 分区槽]                           <==与磁盘有关
    选项与参数:
    -a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息; 
    -f :开机到目前为止,系统复制 (fork) 的进程数;
    -s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
    -S :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量; 
    -d :列出磁盘的读写总量统计表
    -p :后面列出分区槽,可显示该分区槽的读写总量统计表
    
    范例一:统计目前主机 CPU 状态,每秒一次,共计三次!
    [log@www current]$ vmstat -S M 1 3
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     1  0   5623    206      0  15365    0    0    43    52    0    0  5  1 94  0  0
     9  0   5623    206      0  15367    0    0     0     0 80150 118375 10  3 87  0  0
     6  0   5623    200      0  15368    0    0     0     0 80045 123377 11  3 86  0  0
    

    基本说明如下:
      进程字段 (procs) 的项目分别为:
      r :等待运作中的进程数量;b:不可被唤醒的进程数量。这两个项目越多,代表系统越忙碌 (因为系统太 忙,所以很多进程就无法被执行或一直在等待而无法被唤醒之故)。
      内存字段 (memory) 项目分别为:
      swpd:虚拟内存被使用的容量; free:未被使用的内存容量; buff:用于缓冲存储器; cache:用于高速
    缓存。
      内存置换空间 (swap) 的项目分别为:
      si:由磁盘中将进程取出的量;so:由于内存不足而将没用到的进程写入到磁盘的 swap 的容量。如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与主存储器之间传来传去,系统效能会很差!
      磁盘读写 (io) 的项目分别为:
      bi:由磁盘读入的区块数量; bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常 忙碌!
      系统 (system) 的项目分别为:
      in:每秒被中断的进程次数; cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与接口设备的 沟通非常频繁! 这些接口设备当然包括磁盘、网络卡、时间钟等。 
      CPU 的项目分别为:
      us:非核心层的 CPU 使用状态; sy:核心层所使用的 CPU 状态; id:闲置的状态; wa:等待 I/O 所 耗费的 CPU 状态; st:被虚拟机 (virtual machine) 所盗用的 CPU 使用状态 (2.6.11 以后才支持)。

    相关文章

      网友评论

          本文标题:进程管理

          本文链接:https://www.haomeiwen.com/subject/mbzasxtx.html