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 传送给某个工作或 PIDkill -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命令重新调整。例如调整bashnice值为 10:

[root@101c7 bin]$ renice 10 104660
104660 (process ID) old priority 0, new priority 10

修改了bashnice值后,使用bash运行的命令也会继承这一nice值。也就是nice会由父程序传递给子程序。