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
会由父程序传递给子程序。