Linux 进程查询与管理
进程查看命令
查询系统上正在运行的进程,可以使用 ps 命令。常用参数如下:
| 参数 | 说明 | 
|---|---|
| -A | 显示所有进程 | 
| -a | 不与终端有关的所有进程 | 
| -u | 与有效用户相关的进程 | 
| x | 通常与 a 参数一起使用,可列出较完整信息 | 
| l | 将 PID 信息较详细列出来 | 
| j | 工作的格式(jobs format) | 
| -f | 生成更为完整的输出 | 
要查询与当前登录会话相关的 PID 和相关信息,可以使用 ps -l 命令,如下所示:
[root@101c7 bin]$ ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  40090  40085  0  80   0 - 28919 do_wai pts/0    00:00:00 bash
0 S     0  40855  40090  0  80   0 - 27024 wait_w pts/0    00:00:00 tail
0 R     0  42025  40090  0  80   0 - 38332 -      pts/0    00:00:00 ps
结果仅显示与当前操作环境(bash)相关的进程。表格中各选项的含义如下:
| 表头 | 例值 | 说明 | 
|---|---|---|
| F | 4 | 4:表示此进程权限为 root; 1:表示此子进程仅可进行复制(fork)而不能执行(exec)。  | 
| S | S | R(Runing):程序正在运行; I(Idle):空闲,超过 20 秒的睡眠; S(Sleep):进程目前正在睡眠状态(idle),但可被唤醒(signal); D:不可被唤醒的睡眠状态,可能在等到 I/O 的情况; T:停止状态,可能在工作控制(后台暂停)或除错(traced); Z(Zombie):僵尸进程,进程已经被终止但无法被移出内存。  | 
| UID/PID/PPID | 0/40090/40085 | 代表进程被该 UID 所拥有/进程 PID/父进程 PID。 | 
| C | 0 | 代表 CPU 使用率,单位是百分比。 | 
| PRI/NI | 80/0 | Priority/Nice 的缩写,代表进程执行优先级,越小优先级越高。 | 
| ADDR | - | 指出该进程在内存的虚拟地址,running 中的进程显示-。 | 
| SZ | 28919 | 代表此进程占用多少物理内存。 | 
| WCHAN | do_wai | 表示目前进程是否运行在,运行中显示-。 | 
| TTY | pts/0 | 用户终端位置,远程登录使用动态终端接口(pts/n),守护进程显示?。 | 
| TIME | 00:00:00 | 使用掉的 CPU 时间,指进程实际花费 CPU 运行的时间。 | 
| CMD | bash | command 的缩写,正在执行的命令名称。 | 
另外,如果看到的 bash 状态为 S,则是因为它触发了 ps,此时 ps 状态为 R。
查看系统所有进程可以使用 ps aux 命令组合:
[root@101c7 bin]$ ps aux | sed -n '1~17p'
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         21  0.0  0.0      0     0 ?        S<   Sep09   0:00 [kworker/2:0H]
root        788  0.0  0.0      0     0 ?        S<   Sep09   0:00 [xfs-log/sda1]
root       1131  0.0  0.1 222740  5640 ?        Ssl  Sep09   0:19 /usr/sbin/rsyslogd -n
root      11078  0.0  0.0      0     0 ?        S<   Sep13   0:00 [bioset]
root      40855  0.0  0.0 108096   616 pts/0    S    04:07   0:00 tail -f sh01.sh
使用 BSD 选项显示结果表头说明如下:
| 表头 | 例值 | 说明 | 
|---|---|---|
| USER | root | 该进程所属账号。 | 
| PID | 40855 | 进程标识符。 | 
| %CPU | 0.0 | 进程使用掉的 CPU 资源百分比。 | 
| %MEM | 0.1 | 进程所占用的物理内存百分比。 | 
| VSZ | 108096 | 进程使用掉的虚拟内存量(KB)。 | 
| RSS | 616 | 该进程占用的固定内存量(KB)。 | 
| TTY | pts/0 | 该进程运行的终端,和终端无关显示? | 
| STAT | Ssl | 进程主状态: O(正在运行)R(可运行)/S(休眠)/D(挂起)/T(停止)/Z(僵尸进程) 进程副状态: <(运行在高优先级上)/N(运行在低优先级上)/L(该进程所有页面锁定在内存中)/s(该进程是控制进程)/l(该进程是多线程)/+(该进程运行在前台)。  | 
| START | 04:07 | 该进程被触发的启动时间。 | 
| TIME | 0:19 | 该进程被触发启动的时间。 | 
| COMMAND | tail -f | 该进程的实际命令。 | 
想要更直观展示进程间的关系,可以使用命令组合ps axjf将结果用进程树显示:
[root@101c7 bin]$ ps axjf
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
     0      2      0      0 ?            -1 S        0   0:00 [kthreadd]
     1    897    897    897 ?            -1 Ss       0   0:00 login -- root
   897 104660 104660 104660 tty1     104660 Ss+      0   0:00  \_ -bash
     1   1130   1130   1130 ?            -1 Ss       0   0:00 /usr/sbin/sshd -D
  1130  40085  40085  40085 ?            -1 Ss       0   0:00  \_ sshd: root@pts/0
40085  40090  40090  40090 pts/0     43864 Ss       0   0:00      \_ -bash
40090  40855  40855  40090 pts/0     43864 S        0   0:00          \_ tail -f sh01.sh
40090  43864  43864  40090 pts/0     43864 R+       0   0:00          \_ ps axjf
更方便展示进程树用pstree命令:
[root@101c7 thin1]$ pstree -Apu
systemd(1)-+-NetworkManager(881)-+-{NetworkManager}(905)
           |                     `-{NetworkManager}(909)
           |-VGAuthService(867)
           |-atd(27679)
           |-auditd(843)-+-audispd(62781)-+-sedispatch(62782)
           |             |                `-{audispd}(62783)
           |             `-{auditd}(844)
进程查看工具
使用top可以持续监测进程的运行状态。在启动top时可以使用以下参数:
| 参数 | 说明 | 
|---|---|
-d | 
定义界面刷新时间,默认为 5 秒 | 
-b | 
以批次的方式执行top,通常搭配重定向将批处理结果输出到文件 | 
-n | 
与-b搭配,设定刷新的总次数 | 
-p | 
指定某个 PID 进行监测 | 
在 top 程序中常用的交互按键如下:
| 按键 | 说明 | 
|---|---|
? | 
显示在top中可以输入的按键命令 | 
P | 
以 CPU 使用率排序 | 
M | 
以内存使用量排序 | 
N | 
以 PID 排序 | 
T | 
由该进程使用的 CPU 时间累积(TIME+)排序 | 
k | 
给某个 PID 发送一个信号,相当于kill命令 | 
r | 
给某个 PID 重新分配一个nice值 | 
f | 
设置排序依据 | 
q | 
退出top | 
进入top界面查看,按 CPU 使用率排序是默认选项:
[root@101c7 bin]$ top
top - 05:47:44 up 4 days, 14:38,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 229 total,   2 running, 227 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861280 total,  2434616 free,   278880 used,  1147784 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3277072 avail Mem 
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
     1 root      20   0  193840   6964   4200 S   0.3  0.2   1:49.89 systemd
 10771 root      20   0       0      0      0 S   0.3  0.0   0:51.26 kworker/3:0
 46205 root      20   0  162104   2340   1576 R   0.3  0.1   0:00.02 top
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.11 kthreadd
     4 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.01 ksoftirqd/0  
顶部总共有五行,每个参数用逗号隔开。用上例做说明详细定义。
第一行(top):
| 值 | 定义 | 
|---|---|
| 05:47:44 up 4 days, 14:38 | 当前时间和系统运行时间 4 天 14 小时 38 分钟 | 
| 2 users | 已登录系统的用户数 | 
| load average: 0.00, 0.01, 0.05 | 系统在 1 分钟、5 分钟和 15 分钟内的平均工作负载,多核处理器需要除以核心数 | 
第二行(Tasks):
| 值 | 定义 | 
|---|---|
| 229 total | 当前进程总数 | 
| 2 running, 227 sleeping, 0 stopped, 0 zombie | 运行状态为运行中(r)、睡眠中(s)、停止(t)和僵尸(z)的进程树数量 | 
第三行(%Cpu(s))多核处理器可以使用数字键 1 来切换不同 CPU 的负载率:
| 值 | 定义 | 
|---|---|
| 0.0 us | 用户空间占用 CPU | 
| 0.1 sy | 内核空间占用 CPU | 
| 0.0 ni | 用户进程空间内改变过优先级的进程占用 CPU 百分比 | 
| 99.9 id | 空闲 CPU 百分比 | 
| 0.0 wa | 等待输入输出的 CPU 时间百分比,磁盘读写速度造成的卡顿体现在此 | 
| 0.0 hi | 硬件 CPU 中断占用百分比 | 
| 0.0 si | 软中断占用百分比 | 
| 0.0 st | 虚拟机占用百分比 | 
第四行(KiB Mem):
| 值 | 定义 | 
|---|---|
| 3861280 total | 物理内存总量 | 
| 2434616 free | 空闲内存总量 | 
| 278880 used | 使用中的物理内存总量 | 
| 1147784 buff/cache | 作为内核缓存的内存量 | 
第五行(KiB Swap):
| 值 | 定义 | 
|---|---|
| 2097148 total | 交换空间总量 | 
| 2097148 free | 交换空间空闲量 | 
| 0 used | 交换空间使用量 | 
| 3277072 avail Mem | 可用内存 | 
进程管理
使用 kill 命令可以将 signal 传送给某个工作或 PID:kill -signal PID
kill 参数可使用的信号(signal)能用 kill -l 查询,常用的有:
| 参数 | 说明 | 
|---|---|
| -1 | 重新读取一次参数的配置文件,类似reload重新启动 | 
| -2 | 中断信号,与[Ctrl]+c 发出的一样 | 
| -9 | 立刻强制中断一个进程运行 | 
| -15 | 以正常的程序方式终止进程(默认信号) | 
| -19 | 暂停进程,与[Ctrl]+z 发出的一样 | 
kill的目标可以是PID(直接输入数字)也可以是后台工作号码(%n)。例如将后台第 3 个任务终止:
[root@101c7 ~]$ kill %2 ; jobs
[1]+  Stopped                 tail -f root1.txt
[2]   Running                 tail -f root.txt &
[3]-  Running                 tail -f list_error.txt &
[root@101c7 ~]$ kill %2 ; jobs
-bash: kill: (37698) - No such process
[1]+  Stopped                 tail -f root1.txt
[2]   Terminated              tail -f root.txt
[3]-  Running                 tail -f list_error.txt &
[root@101c7 ~]$ kill %2 ; jobs
-bash: kill: %2: no such job
[1]+  Stopped                 tail -f root1.txt
[3]-  Running                 tail -f list_error.txt &
可以看到工作状态由Running转为Terminated,最后消失在后台工作列表中。
加入-2发送中断信号:
[root@101c7 ~]$ kill -2 %3;jobs
-bash: kill: (37916) - No such process
[1]+  Stopped                 tail -f root1.txt
[3]-  Interrupt               tail -f list_error.txt
工作状态先变为Interrupt,然后再消失。
使用-9强制结束工作:
[root@101c7 ~]$ kill -9 %4 ; jobs
-bash: kill: (39089) - No such process
[1]+  Stopped                 tail -f root1.txt
[3]   Running                 tail -f root.txt &
[4]-  Killed                  tail -f root.txt
工作状态先变为killed,然后消失。
还可以通过pkill命令来将所有某个命令名称启动的进程全部删除。例如关闭http相关的进程:
[root@localhost ~]$ pkill -ec http
httpd killed (pid 6860)
httpd killed (pid 6861)
httpd killed (pid 6862)
httpd killed (pid 6863)
httpd killed (pid 6864)
5
用killall命令也可以达到pkill同样的效果:
[root@101c7 thin1]$ killall -1 rsyslogd
进程优先级
程序优先执行序(PRI,Priority),值越低代表执行越优先,PRI 值由内核动态调整,用户无法直接调整 PRI 值。
用户能调整的是nice值,nice值与pri值求和得出程序实际优先值。nice值的设置规则:
nice值可调整范围为-20~19;root可以随意调整他人进程nice值;- 一般用户只能调整自己进程的
nice值,范围是 0~19; 
用nice命令能在程序启动时设置nice值。例如以-10 的nice值启动top:
[root@101c7 bin]$ nice -n -10 top -d 1
对已存在的进程除了可以用top设置外,还能用renice命令重新调整。例如调整bash的nice值为 10:
[root@101c7 bin]$ renice 10 104660
104660 (process ID) old priority 0, new priority 10
修改了bash的nice值后,使用bash运行的命令也会继承这一nice值。也就是nice会由父程序传递给子程序。