一、进程的定义

一个程序运行起来后就是进程了, 其存在生命周期.

1.1 进程是如何创建的.

Linux系统的系统启动过程中内核加载的第一个进程为init(CentOS 7为systemd)进程, 这意味着创建了用户空间; 用户空间的所有进程都由init进程创建, 由其创建的子进程也可以自己生成子进程.
也就是说进程存在着父子关系, 每一个进程都由其父进程创建(通过fork()创建子进程, 使用clone()将数据克隆给子进程).

1.2 进程优先级

进程的优先级范围为0~139, 其中1~99为实时优先级, 100~139为静态优先级; 数字越小, 优先级越高.
Note: nice值可以调整优先级, nice值范围为-20~19.

1.3 进程类型

进程有两种类型, 如下所示:

  • 守护进程(deamon): 跟终端无关, 在系统引导过程中启动的进程.
  • 前台进程: 跟终端相关, 通过终端启动的进程; 也可把前台启动的进程送往后台, 变为守护模式运行.

1.4 进程状态:

进程状态如下所示:

  • 运行态: running
  • 就绪态/睡眠态: ready
    • 可中断睡眠: interruptable
    • 不可中断睡眠: uninterruptable
  • 停止态: 暂停于内存中, 但不会被调度, 除非手动启动, stopped
  • 僵死态: zombie

二、进程管理相关工具

2.1 pstree命令

pstree - 显示进程树
用法: pstree

[root@zabbix ~]# pstree
systemd─┬─ManagementAgent───2*[{ManagementAgent}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─VGAuthService
        ├─agetty
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon
        ├─dockerd─┬─docker-containe───8*[{docker-containe}]
        │         └─9*[{dockerd}]
        ├─httpd───5*[httpd]
        ├─irqbalance
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mysqld_safe───mysqld───41*[{mysqld}]
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        ├─vmtoolsd───{vmtoolsd}
        ├─wpa_supplicant
        ├─zabbix_agentd───6*[zabbix_agentd]
        └─zabbix_server───33*[zabbix_server]

2.2 ps命令

ps - 打印系统当前进程状态的快照
用法: ps [OPTIONS]

# ps的选项支持两种风格, 一种选项带“-”号, 一种不带
# 常用组合: aux
    # u: 以用户为中心组织进程状态信息显示
    # a: 与终端相关的进程
    # x: 与终端无关的进程
[root@zabbix ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  43244  3668 ?        Ss   19:14   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    19:14   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    19:14   0:00 [ksoftirqd/0]
root          6  0.0  0.0      0     0 ?        S    19:14   0:00 [kworker/u256:0]
...

每一列的意义:

  • VSZ: Virtual memory Size, 虚拟内存集
  • RSS: ReSident Size, 常驻内存集
  • STAT: 进程状态:
    • R: running
    • S: interrputable sleeping
    • D: uninterrputabl sleeping
    • T: stopped
    • Z: zombie
    • +: 前台进程
    • l: 多线程进程
    • N: 低优先级进程
    • <: 高优先级进程
    • s: session leader
# 常用组合: -ef
    # -e: 显示所有进程
    # -f: 显示完整格式的进程信息
[root@zabbix ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 19:14 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2      0  0 19:14 ?        00:00:00 [kthreadd]
root          3      2  0 19:14 ?        00:00:00 [ksoftirqd/0]
root          6      2  0 19:14 ?        00:00:00 [kworker/u256:0]
root          7      2  0 19:14 ?        00:00:00 [migration/0]
...

# 常用组合: -ejH
    # -j: 任务格式
    # -H: 以进程层级格式显示进程相关信息
[root@zabbix ~]# ps -ejH
   PID   PGID    SID TTY          TIME CMD
     2      0      0 ?        00:00:00 kthreadd
     3      0      0 ?        00:00:00   ksoftirqd/0
...
  1463   1463   1463 ?        00:00:00   httpd
  1793   1463   1463 ?        00:00:00     httpd
  1808   1463   1463 ?        00:00:00     httpd
  1812   1463   1463 ?        00:00:00     httpd
  1829   1463   1463 ?        00:00:00     httpd
  1839   1463   1463 ?        00:00:00     httpd
  1469   1469   1469 ?        00:00:00   sshd
  3136   3136   3136 ?        00:00:00     sshd
  3139   3139   3139 pts/0    00:00:00       bash
  3719   3719   3719 pts/1    00:00:00       bash
  4743   4743   3719 pts/1    00:00:00         ps
...

# 常用组合: -eFH
    # -F: 显示完整格式的进程信息
[root@zabbix ~]# ps -eFH
UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root          2      0  0     0     0   1 19:14 ?        00:00:00 [kthreadd]
root          3      2  0     0     0   0 19:14 ?        00:00:00   [ksoftirqd/0]
root          6      2  0     0     0   1 19:14 ?        00:00:00   [kworker/u256:0]

# 常用组合: -eo, axo, 显示自定义字段
# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
    # ni: nice值
    # pri: priority:优先级
    # psr: processor, 进程运行在哪颗CPU上
    # rtprio: 实时优先级
[root@zabbix ~]# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm  
   PID    TID CLS RTPRIO  NI PRI PSR %CPU STAT WCHAN          COMMAND
     1      1 TS       -   0  19   1  0.0 Ss   ep_poll        systemd
     2      2 TS       -   0  19   1  0.0 S    kthreadd       kthreadd
...

# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
[root@zabbix ~]# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
STAT  EUID  RUID TT        TPGID   SESS   PGRP   PPID    PID %CPU COMMAND
Ss       0     0 ?            -1      1      1      0      1  0.0 systemd
S        0     0 ?            -1      0      0      0      2  0.0 kthreadd
...

2.3 pgrep, pkill命令

pgrep, pkill - 基于进程名和进程其他属性查找进程或者发送信号给进程
用法: pgrep [option] pattern
用法: pkill [option] pattern

# 选项:
    # -U uid: 有效用户
    # -u uid: 实时用户
    # -t terminal: 与指定终端相关进程
    # -l: 显示进程名
    # -a: 显示完整格式的进程名
    # -P pid: 显示其父进程为此处指定的进程的进程列表

[root@zabbix ~]# pgrep sshd -l
1433 sshd
3088 sshd

[root@zabbix ~]# pgrep -u root -l
1 systemd
2 kthreadd
3 ksoftirqd/0
6 kworker/u256:0
...

[root@zabbix ~]# pgrep -u root -a
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 kthreadd
3 ksoftirqd/0
...

[root@zabbix ~]# pgrep -P 1472 -l
1629 docker-containe

# pkill根据进程名或者上面选项杀死相关进程
[root@zabbix ~]# pkill httpd
[root@zabbix ~]# ps aux | grep httpd
root       3285  0.0  0.0 112644   952 pts/0    S+   20:26   0:00 grep --color=auto httpd

2.4 pidof命令

pidof - 根据进程名获取pid号
用法: pidof Process_Name

[root@zabbix ~]# pidof sshd
3088 1433

2.5 top命令

top - 交互式进程查看命令
用法: top [options]

# options:
    # -d seconds: 指定刷新时间间隔
    # -b: 以批次方式显示
    # -n Number: 显示多少次
[root@zabbix ~]# top
top - 20:53:28 up 31 min,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 400 total,   1 running, 399 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  1.0 sy,  0.0 ni, 98.2 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :  1868688 total,  1265852 free,   262980 used,   339856 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1417916 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                            
  2021 mysql     20   0 1632500 106580   9380 S   1.0  5.7   0:16.87 mysqld                                                             
  3959 root      20   0  146436   2344   1424 R   1.0  0.1   0:00.07 top                                                                
  3426 root      20   0       0      0      0 S   0.7  0.0   0:02.16 kworker/1:2                                                        
  1440 root      20   0  436816  25064  13508 S   0.3  1.3   0:06.17 dockerd                                                            
  1470 zabbix    20   0   82384   2412   1452 S   0.3  0.1   0:01.22 zabbix_agentd                                                      
  1625 root      20   0  226888   7604   4220 S   0.3  0.4   0:04.36 docker-containe                                                    
  3049 zabbix    20   0  260448   2616    420 S   0.3  0.1   0:00.35 zabbix_server                                                      
  3052 zabbix    20   0  367412   5420   2172 S   0.3  0.3   0:00.60 zabbix_server                                                      
  3064 zabbix    20   0  260448   3220   1016 S   0.3  0.2   0:01.29 zabbix_server                                                      
     1 root      20   0  190692   3648   2400 S   0.0  0.2   0:01.17 systemd                                                            
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd                                                           
     3 root      20   0       0      0      0 S   0.0  0.0   0:00.04 ksoftirqd/0                                                        
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                       
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kworker/u256:0                                                     
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.03 migration/0          
...

# top有许多内置命令:
    # 排序:
        # P: 以占据的CPU百分比排序
        # M: 以占据内存百分比排序
        # T: 累计占据CPU时长排序

    # 首部信息显示:
        # uptime信息: l命令
        # tasks及cpu信息: t命令
            # cpu分别显示: 1(数字)
        # memory信息: m命令

    # 退出命令: q
    # 修改刷新时间间隔: s
    # 终止指定进程: k

2.6 htop

htop - 交互式进程查看命令, 需要使用epel源
用法: htop [options]

# options:
    # -d seconds: 指定延迟时间
    # -u UserName: 仅显示指定用户的进程
    # -s COLOMN: 以指定字段进行排序
# 内建命令:
    # s: 跟着选定进程的系统调用
    # l: 显示选定进程打开的文件列表
    # a: 将选定进程绑定至某指定CPU核心
    # t: 显示进程树

2.7 vmstat

vmstat - 打印虚拟内存统计数据
用法: vmstat [options] [delay [count]]

# options:
    # -d: 打印磁盘统计数据
    # -p device: 打印指定分区的统计数据
    # -t: 给每一行追加时间戳
[root@zabbix ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sda     6838      8  613755    4790  12258     84  531972   37083      0     10
sr0        0      0       0       0      0      0       0       0      0      0
dm-0    6322      0  554278    4356  11317      0  527876   37347      0     10
dm-1     126      0    2136      24      0      0       0       0      0      0

[root@zabbix ~]# vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                 200      54733       1025       4096

[root@zabbix ~]# vmstat -t
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st                 CST
 1  0      0 1186244    948 417640    0    0    52    48   86  157  0  1 99  0  0 2018-01-28 21:11:25

# 不跟选项默认打印内存统计数据
[root@zabbix ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 6  0      0 1186596    948 417512    0    0    56    49   87  159  1  1 99  0  0

2.8 sar

sar - Collect, report, or save system activity information

2.9 iostat

iostat - 为设备和分区打印CPU和IO统计数据
用法: iostat [options] [devices|partitions]

[root@zabbix ~]# iostat /dev/sda1 /dev/mapper/centos_docker--package-root 
Linux 3.10.0-327.el7.x86_64 (zabbix.leistudy.com)       01/28/2018      _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.60    0.00    0.89    0.07    0.00   98.44

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda1              0.34         7.60         0.57      27366       2060
dm-0              6.37        94.37       144.54     339783     520411

2.10 iftop

iftop - 显示主机网络接口带宽使用情况
用法: iftop [-nNpblBP] [-i interface] [-f filter code] [-F net/mask]

[root@zabbix ~]# iftop -i eno16777736 -nN
                           12.5Kb                     25.0Kb                      37.5Kb                     50.0Kb                62.5Kb
└──────────────────────────┴──────────────────────────┴───────────────────────────┴──────────────────────────┴───────────────────────────
192.168.123.132                                        => 192.168.123.1                                           3.41Kb  4.91Kb  3.39Kb
                                                       <=                                                          480b   2.81Kb  1.38Kb
192.168.123.132                                        => 192.168.123.2                                           1.12Kb   623b    283b
                                                       <=                                                         1.12Kb   670b    305b
192.168.123.132                                        => 111.13.100.92                                            672b    336b    153b
                                                       <=                                                          672b    336b    153b

...
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
TX:             cum:   10.5KB   peak:   9.65Kb                                                           rates:   5.19Kb  5.84Kb  3.82Kb
RX:                    5.01KB           7.60Kb                                                                    2.25Kb  3.79Kb  1.82Kb
TOTAL:                 15.5KB           17.2Kb                                                                    7.44Kb  9.63Kb  5.64Kb

2.11 glances

glances - 一个跨平台基于指针的系统监视工具
用法: glances [options]

# 不跟选项, 默认显示所有的信息
[root@zabbix ~]# glances
zabbix.leistudy.com (CentOS Linux 7.2.1511 64bit / Linux 3.10.0-327.el7.x86_64)                                           Uptime: 0:21:25

CPU  [|                       4.5%]   CPU       4.5%  nice:     0.0%   MEM     20.7%  active:     306M   SWAP      0.0%   LOAD    2-core
MEM  [|||||                  20.7%]   user:     2.5%  irq:      0.0%   total:  1.78G  inactive:   267M   total:   2.00G   1 min:    0.05
SWAP [                        0.0%]   system:   1.7%  iowait:   0.0%   used:    377M  buffers:    948K   used:        0   5 min:    0.03
                                      idle:    95.8%  steal:    0.0%   free:   1.41G  cached:     369M   free:    2.00G   15 min:   0.05

NETWORK     Rx/s   Tx/s   TASKS 409 (484 thr), 1 run, 408 slp, 0 oth sorted automatically by cpu_percent, flat view
docker0       0b     0b
_16777736   144b   10Kb     CPU%  MEM%  VIRT   RES   PID USER        NI S     TIME+ IOR/s IOW/s Command 
lo         172Kb  172Kb      6.7   1.0  227M 18.0M  3737 root         0 R   0:01.21     0     0 /usr/bin/python /usr/bin/glances
                             0.6   0.5  150M 9.77M  1643 root         0 S   0:02.62     0     0 docker-containerd -l unix:///var/run/dock
DISK I/O     R/s    W/s      0.6   5.9 1.56G  107M  2000 mysql        0 S   0:10.60     0    4K /usr/libexec/mysqld --basedir=/usr --data
dm-0          1K    12K      0.3   1.4  427M 24.7M  1464 root         0 S   0:03.94     0     0 /usr/bin/dockerd 
dm-1           0      0      0.3   0.2  254M 3.14M  3120 zabbix       0 S   0:00.80     0     0 /usr/sbin/zabbix_server: alert manager #1
sda1           0      0      0.3   0.4  242M 7.80M  1187 root         0 S   0:02.82     0     0 /usr/sbin/vmtoolsd 
sda2          1K    12K      0.3   0.0     0     0   864 root         0 S   0:04.33     0     0 kworker/0:3
sr0            0      0      0.3   0.2  254M 2.82M  3088 zabbix       0 S   0:00.23     0     0 /usr/sbin/zabbix_server: http poller #1 [
                             0.3   0.9  540M 16.0M  1460 root         0 S   0:00.56     0     0 /usr/bin/python -Es /usr/sbin/tuned -l -P
FILE SYS    Used  Total      0.0   0.2  254M 3.77M  3115 zabbix       0 S   0:00.00     0     0 /usr/sbin/zabbix_server: trapper #4 [proc
/          8.84G  17.5G      0.0   0.0     0     0   121 root         0 S   0:00.00     0     0 rcuob/112
/boot       184M   497M      0.0   0.0     0     0   111 root         0 S   0:00.00     0     0 rcuob/102
_/overlay  8.84G  17.5G      0.0   0.0     0     0   226 root         0 S   0:00.00     0     0 rcuos/88
                             0.0   0.0     0     0    94 root         0 S   0:00.00     0     0 rcuob/85
                             0.0   0.0     0     0    68 root         0 S   0:00.00     0     0 rcuob/59
                             0.0   0.0     0     0    42 root         0 S   0:00.00     0     0 rcuob/33
                             0.0   0.0     0     0    16 root         0 S   0:00.00     0     0 rcuob/7
                             0.0   0.0     0     0   529 root       -20 S   0:00.00     0     0 ata_sff
                             0.0   0.0     0     0   623 root       -20 S   0:00.00     0     0 kdmflush
                             0.0   0.1 42.5M 2.14M   755 root         0 S   0:00.12     0     0 /usr/lib/systemd/systemd-udevd 
                             0.0   0.0     0     0   266 root         0 S   0:00.10     0     0 watchdog/0
                             0.0   0.0     0     0   162 root         0 S   0:00.00     0     0 rcuos/24
                             0.0   0.0     0     0     7 root         0 S   0:00.50     0     0 migration/0
                             0.0   0.0     0     0   549 root       -20 S   0:00.00     0     0 ttm_swap
                             0.0   0.0     0     0   237 root         0 S   0:00.00     0     0 rcuos/99
                             0.0   0.0     0     0   225 root         0 S   0:00.00     0     0 rcuos/87
                             0.0   0.0     0     0   248 root         0 S   0:00.00     0     0 rcuos/110
                             0.0   0.0     0     0   267 root         0 S   0:00.10     0     0 watchdog/1
                             0.0   0.0     0     0   189 root         0 S   0:00.00     0     0 rcuos/51
                             0.0   0.0     0     0   208 root         0 S   0:00.00     0     0 rcuos/70
                             0.0   0.0     0     0   853 root       -20 S   0:00.00     0     0 xfs-data/sda1
                             0.0   0.0     0     0   212 root         0 S   0:00.00     0     0 rcuos/74

2018-01-29 10:20:35       No warning or critical alert detected

# 在glances中可以使用子命令进行交互
    # a: 自动排序进程表
    # b: 网络IO显示在bit/s和Bytes/s之间切换
    # c: 通过CPU使用率排序
    # d: 显示或者隐藏磁盘I/O信息
    # f: 显示或隐藏文件系统信息
    # n: 显示或隐藏网络接口信息
    # 1: 在全局CPU和每颗CPU状态之间切换
    # 2: 隐藏左边的网络IO、DISK I/O、FILE SYSTEM信息
    # Enter键: 通过模式过滤进程
Process filter pattern: httpd
Processes filter: httpd (press ENTER to edit)                                     
TASKS   6 (6 thr), 0 run, 6 slp, 0 oth sorted by io_counters, flat view                          

  CPU%  MEM%  VIRT   RES   PID USER        NI S     TIME+ IOR/s IOW/s Command                           
   0.0   0.8  446M 14.9M  1462 root         0 S   0:00.43     0     0 /usr/sbin/httpd -DFOREGROUND                          
             CPU affinity: 2 cores                          
             Memory info: shared 8.80M text 484K lib 0 data 77.5M dirty 0 swap 0                          
             Open: threads 1 files 8 TCP 1 UDP 0                           
             IO nice: No specific I/O priority                          
   0.0   0.4  447M 7.44M  1863 apache       0 S   0:00.00     0     0 /usr/sbin/httpd -DFOREGROUND                          
   0.0   0.4  447M 7.44M  1880 apache       0 S   0:00.00     0     0 /usr/sbin/httpd -DFOREGROUND                          
   0.0   0.4  447M 7.44M  1894 apache       0 S   0:00.00     0     0 /usr/sbin/httpd -DFOREGROUND                          
   0.0   0.4  447M 7.44M  1873 apache       0 S   0:00.00     0     0 /usr/sbin/httpd -DFOREGROUND                          
   0.0   0.4  447M 7.44M  1887 apache       0 S   0:00.00     0     0 /usr/sbin/httpd -DFOREGROUND                          
______________________________________________________________________                          
   0.0   2.9 2.62G 52.1M                                      0     0     

# glances还可以运行在C/S模式下
    # -s: 运行glances在server模式
    # -B IPADDR: 绑定IP
    # -p PORT: 指定端口号, 默认为61209
    # -c CLIENT: 通过IP地址或者主机名连接至一个glances服务器
[root@zabbix ~]# glances -s -B 192.168.123.132 -p 12345
Glances server is running on 192.168.123.132:12345

[root@zabbix ~]# glances -c 192.168.123.132 -p 12345

2.12 dstat

dstat - 生成系统资源统计信息的通用工具
用法: dstat [options]

# 直接使用显示CPU, DISK, NETWORK, PAGING, SYSTEM信息
[root@zabbix ~]# dstat 
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--

# -d: 只显示磁盘IO信息
  0   0 100   0   0   0|4096B 8192B| 270B  540B|   0     0 | 147   270 ^C
[root@zabbix ~]# dstat -d
-dsk/total-
 read  writ

# -c: 只显示cpu使用情况
[root@zabbix ~]# dstat -c
----total-cpu-usage----
usr sys idl wai hiq siq

# -n: 只显示network信息
[root@zabbix ~]# dstat -n 
-net/total-
 recv  send

# -m: 只显示内存信息
[root@zabbix ~]# dstat -m
------memory-usage-----
 used  buff  cach  free

# -s: 只显示swap信息
[root@zabbix ~]# dstat -s
----swap---
 used  free

# -y: 只显示system状态(中断, 上下文切换)
[root@zabbix ~]# dstat -y
---system--
 int   csw 

# -g: 显示页缓存状态(page in, page out)
[root@zabbix ~]# dstat -g
---paging--
  in   out 

# -afv: 显示所有信息, 根据teminal大小显示选项, 如果terminal不够大, 则自动删除一些信息
[root@zabbix ~]# dstat -afv
Terminal width too small, trimming output.
-------cpu0-usage--------------cpu1-usage------ --dsk/sda-- net/eno1677 ---paging-- ---system-- ---procs--- ------memory-usage----->
usr sys idl wai hiq siq:usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw |run blk new| used  buff  cach  free>