Linux 进程查看及管理工具

前言

说到进程管理,很多人第一想到的就是 ps -ef|grep xxx 。没错,这的确是最常用的一个进程查看组合,但是进程查看及管理命令可不止 ps 这么一个,还有很多命令等待我们的挖掘和学习。比如: pstreepidofpgreptophtopglancespmapvmstatdstatkillpkilljobbgfgnohupnicerenicekillall ……

pstree

pstree - display a tree of processes.

顾名思义,这是一个显示进程树的命令,使用也比较简单。

ps

ps - report a snapshot of the current processes.

显示 ps 命令执行这一刻的进程信息快照,最常用的进程查看工具。

ps aux

常用组合之一,其中 aux 选项含义为:

1
2
3
a :所有与终端相关的进程;
x :所有与终端无关的进程;
u :以用户为中心组织进程状态信息显示;

例如:

1
2
3
4
5
6
7
8
[hzz@magedu ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193632 6356 ? Ss 9月25 0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 9月25 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 9月25 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 9月25 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 9月25 0:00 [migration/0]
...

其中各字段的含义为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
USER : user ,用户;
PID : pid ,进程 pid ;
%CPU : cpu use percent , cpu 使用率;
%MEM : memory use percent ,内存使用率;
VSZ : virtual memory size 虚拟内存集,每个进程占用的内存(不是实际占用,因为有共享库的存在);
TTY : 终端编号;
RSS : resident size ,常驻内存集,不能放到交换内存的数据;
STAT : state ,运行状态;
R : running ,正在运行;
S : interruptable sleeping ,可中断睡眠;
D : uninterruptable sleeping ,不可中断睡眠;
T : stopped ,已停止;
Z : zombie ,僵死进程;
+ : is in the foreground process group ,前台进程;
l : is multi-threaded ,多线程进程;
N : low-priority ,低优先级进程;
< : high-priority ,高优先级进程;
s : session leader ,会话主导;
START :启动时间;
TIME :持续时间;
COMMAND :执行的命令;

ps -efps -eFH

这是另外两个常用的 ps 命令组合。

H 选项为以层级结构显示进程的相关信息。

其中 ps -eFps -ef 多出了三个字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[hzz@magedu ~]$ ps -ef|head 
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 9月25 ? 00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0 0 9月25 ? 00:00:00 [kthreadd]
root 3 2 0 9月25 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 9月25 ? 00:00:00 [kworker/0:0H]
root 7 2 0 9月25 ? 00:00:00 [migration/0]
root 8 2 0 9月25 ? 00:00:00 [rcu_bh]
root 9 2 0 9月25 ? 00:00:01 [rcu_sched]
root 10 2 0 9月25 ? 00:00:00 [watchdog/0]
root 11 2 0 9月25 ? 00:00:00 [watchdog/1]
[hzz@magedu ~]$ ps -eF|head
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1 0 0 48408 6356 1 9月25 ? 00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0 0 0 0 0 9月25 ? 00:00:00 [kthreadd]
root 3 2 0 0 0 0 9月25 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 0 0 0 9月25 ? 00:00:00 [kworker/0:0H]
root 7 2 0 0 0 0 9月25 ? 00:00:00 [migration/0]
root 8 2 0 0 0 0 9月25 ? 00:00:00 [rcu_bh]
root 9 2 0 0 0 1 9月25 ? 00:00:01 [rcu_sched]
root 10 2 0 0 0 0 9月25 ? 00:00:00 [watchdog/0]
root 11 2 0 0 0 1 9月25 ? 00:00:00 [watchdog/1]
[hzz@magedu ~]$

其中 C = %CPU ,多出来的三个字段解析为:

1
2
3
SZ : size in physical pages of the core image of the process ,实际占用内存数;
RSS : resident size ,常驻内存集,不能放到交换内存的数据;
PSR : processor that process is currently assigned to ,运行于哪颗cpu上;

ps -eops axo

o-o 选项可以让用户自定义字段,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[hzz@magedu ~]$ ps -eo pid,state,cmd|tail
10455 S /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-afe2c186-c964-466f-8167-4fce963304bb-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0
10538 S /usr/sbin/anacron -s
10599 S [kworker/1:2H]
10617 S [kworker/0:2]
10640 S [kworker/0:0]
10641 S [kworker/1:1H]
10691 S [kworker/0:1]
10710 S [kworker/1:0H]
10711 R ps -eo pid,state,cmd
10712 S tail
[hzz@magedu ~]$ ps axo pid,stat,cmd|tail
10455 S /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-afe2c186-c964-466f-8167-4fce963304bb-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0
10538 Ss /usr/sbin/anacron -s
10599 S< [kworker/1:2H]
10617 S [kworker/0:2]
10640 S [kworker/0:0]
10641 S< [kworker/1:1H]
10691 S [kworker/0:1]
10710 S< [kworker/1:0H]
10713 R+ ps axo pid,stat,cmd
10714 S+ tail
[hzz@magedu ~]$

常用选项有:pidtidclassrtprionipripsrpcpustatwchan:14comm

具体的解析 man ps 里面都有,这里就不多说了。

关于 ps 的用法还有很多,这里只是列出了最常用的几种,更多用法可在 man ps 里找到。

pgreppkill

pgrep, pkill - look up or signal processes based on name and other attributes.

根据条件过滤出相关进程,和 ‘ps -ef|grep xxx’ 组合功能类似,但更加纯粹。

pkill 只是在 pgrep 的基础上,多执行了一步 kill 操作,参数基本相同。

常用参数有:

1
2
3
4
5
6
-u uid : effective user ,有效用户;
-U uid : real user ,启动用户;
-t TERMINAL :与指定的终端相关的进程;
-l :显示进程名;
-a :显示完整格式的进程名;
-P pid :显示此进程的子进程;

pidof

pidof – find the process ID of a running program.

根据进程名称查找 PID 。

pgrep 类似,只不过 pgrep 是根据表达式查找 PID ,而 pidof 则需要根据进程全名。

1
2
3
4
5
6
7
[hzz@magedu ~]$ pgrep ssh
1291
10430
10434
[hzz@magedu ~]$ pidof sshd
10434 10430 1291
[hzz@magedu ~]$

top

top - display Linux processes.

最详细的系统信息显示工具。

排序:

1
2
3
P :以占据 CPU 百分比排序;
M :以占据内存百分比排序;
T :累积占用 CPU 时间排序;

首部信息:

1
2
3
uptime 信息: l ;
tasks 及 cpu 信息: t
内存信息: m ;

其他功能:

1
2
3
退出命令: q
修改刷新时间间隔: s ;
终止指定的进程: k ;

top 命令还有很多高级的用法,但平时接触不是很多,这里只列出一些常用的参数。

uptime

uptime - Tell how long the system has been running.

显示系统运行了多长时间,及系统当前运行状态。

这个命令比较简单,一般是不加参数直接运行。

htop

htop - interactive process viewer.

交互式地显示进程信息的工具,是 top 的升级版,需要额外安装。

1
2
sudo yum install epel-release
sudo yum install htop

常用子命令:

1
2
3
4
5
6
7
l :显示选定的进程打开的文件列表;
s :跟踪选定的进程的系统调用;
t :以层级关系显示各进程状态;
a :将选定的进程绑定至某指定的CPU核心;
u :查看指定用户的进程;
H :显示或隐藏用户线程;
K :显示或隐藏内核线程;

选项和功能跟 top 差不多,只是细节化的显示更加强大,具体可使用 man htop 查看。

vmstat

vmstat - Report virtual memory statistics.

报告虚拟内存的统计数据。

可以不加任何选项执行,也可以自定义数据刷新间隔和刷新次数:

1
2
3
4
5
6
7
8
9
# 以没两2秒的间隔统计3

[hzz@magedu ~]$ vmstat 2 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 412 839028 0 889664 0 0 3 20 36 68 0 0 100 0 0
0 0 412 839028 0 889664 0 0 0 0 68 137 0 0 100 0 0
0 0 412 839028 0 889664 0 0 0 0 64 131 0 0 100 0 0
[hzz@magedu ~]$

下面就来说说各字段的含义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procs :
r :等待运行的进程的个数; CPU 上等待运行的任务的队列长度;
b :处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度;
memory :
swpd :交换内存使用总量;
free :空闲的物理内存总量;
buffer :用于 buffer (缓冲)的内存总量;
cache :用于 cache (缓存)的内存总量;
swap :
si :数据进入 swap 中的数据速率( kb/s );
so :数据离开 swap 的速率( kb/s );
io:
bi :从块设备读入数据到系统的速度( kb/s );
bo :保存数据至块设备的速率( kb/s );
system :
in : interrupts ,中断速率;
cs : context switch ,上下文切换的速率;
cpu :
us : user space 用户空间;
sy : system 系统空间;
id : idle 空闲;
wa : wait 等待 IO 完成;
st : stolen 被虚拟化占用的时间;

常用选项: -s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 显示当前内存的详细信息

[hzz@magedu ~]$ vmstat -s
1879696 K total memory
151008 K used memory
729404 K active memory
154072 K inactive memory
839120 K free memory
0 K buffer memory
889568 K swap cache
2097148 K total swap
412 K used swap
2096736 K free swap
36763 non-nice user cpu ticks
49 nice user cpu ticks
28165 system cpu ticks
21146826 idle cpu ticks
1147 IO-wait cpu ticks
0 IRQ cpu ticks
1029 softirq cpu ticks
0 stolen cpu ticks
664177 pages paged in
4190676 pages paged out
5 pages swapped in
103 pages swapped out
7570390 interrupts
14271702 CPU context switches
1506542741 boot time
14383 forks
[hzz@magedu ~]$

pmap

pmap - report memory map of a process.

报告进程的内存映射表。

顾名思义,就是查看进程所加载的内容占用的物理内存的映射。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[hzz@magedu ~]$ pmap 1
1: /usr/lib/systemd/systemd --switched-root --system --deserialize 21
00007f9f4da0e000 16K r-x-- libuuid.so.1.3.0
00007f9f4da12000 2044K ----- libuuid.so.1.3.0
00007f9f4dc11000 4K r---- libuuid.so.1.3.0
00007f9f4dc12000 4K rw--- libuuid.so.1.3.0
00007f9f4dc13000 228K r-x-- libblkid.so.1.1.0
00007f9f4dc4c000 2048K ----- libblkid.so.1.1.0
00007f9f4de4c000 12K r---- libblkid.so.1.1.0
00007f9f4de4f000 4K rw--- libblkid.so.1.1.0
00007f9f4de50000 4K rw--- [ anon ]
00007f9f4de51000 84K r-x-- libz.so.1.2.7
00007f9f4de66000 2044K ----- libz.so.1.2.7
00007f9f4e065000 4K r---- libz.so.1.2.7
00007f9f4e066000 4K rw--- libz.so.1.2.7
00007f9f4e067000 148K r-x-- liblzma.so.5.2.2
00007f9f4e08c000 2044K ----- liblzma.so.5.2.2
00007f9f4e28b000 4K r---- liblzma.so.5.2.2
00007f9f4e28c000 4K rw--- liblzma.so.5.2.2
00007f9f4e28d000 16K r-x-- libcap-ng.so.0.0.0
00007f9f4e291000 2048K ----- libcap-ng.so.0.0.0
00007f9f4e491000 4K r---- libcap-ng.so.0.0.0
00007f9f4e492000 4K rw--- libcap-ng.so.0.0.0
00007f9f4e493000 16K r-x-- libattr.so.1.1.0
00007f9f4e497000 2044K ----- libattr.so.1.1.0
00007f9f4e696000 4K r---- libattr.so.1.1.0
00007f9f4e697000 4K rw--- libattr.so.1.1.0
...

加上 -x 可以显示更详细的信息。

另一种查看进程所加载的内容占用的物理内存的映射的方式为:

1
cat /proc/PID/maps

glances

glances - A cross-platform curses-based monitoring tool.

一款强大的系统信息查看及监控工具,支持 C/S 模式,可以远程查看其他主机的信息。

不是系统内置的命令,需要额外安装。

1
2
yum install epel-release
yum install glances

tophtop 命令类似,可以直接执行,执行后输入 h 可查看子命令帮助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Glances 1.7.7 with PsUtil 2.2.1

CAREFULWARNINGCRITICAL
CPU user % 50.0 70.0 90.0 Swap % 50.0 70.0 90.0
CPU system % 50.0 70.0 90.0 Temp °C 60.0 70.0 80.0
CPU iowait % 40.0 60.0 80.0 HDD Temp °C 45.0 52.0 60.0
CPU steal % 10.0 15.0 20.0 文件系统 50.0 70.0 90.0
Load 1.4 2.0 10.0 CPU process % 100.0 140.0 180.0
RAM % 50.0 70.0 90.0 MEM process % 50.0 70.0 90.0

a 自动排序 l Show/hide logs
c 根据CPU使用率排序 b Bytes or bits for network I/O
m 根据内存占用比排序 w 删除警告日志
p 根据进程名字排序 x 删除警告和严重级别的日
i Sort processes by I/O rate 1 全局CPU或者每个CPU的状态
d 显示/隐藏硬盘I/O状态 h Show/hide this help screen
f 显示/隐藏文件系统状态 t View network I/O as combination
n 显示/隐藏network状态 u View cumulative network I/O
s 显示/隐藏sensors状态 z Show/hide processes list
y 显示/隐藏hddtemp状态 q Quit (Esc and Ctrl-C also work)

常用选项:

1
2
3
4
5
6
7
8
-b :以 Byte 为单位显示网上数据速率;
-d :关闭磁盘 I/O 模块;
-m :关闭 mount 模块;
-n :关闭 network 模块;
-t :刷新时间间隔;
-1 :每个 cpu 的相关数据单独显示;
-o {HTML|CSV} :输出格式;
-f /PATH/TO/SOMEDIR :设定输出文件的位置;

执行 glances -o HTML -f /PATH/TO/WEBSERVICE 可以生成一个 glances.html 文件,放入 http 服务目录后,可实时刷新系统数据。

C/S 模式

服务器模式:

1
glances -s -B SERVERIPADDR

客户端模式:

1
glances -c SERVERIPADDR

dstat

dstat - versatile tool for generating system resource statistics.

生成系统资源统计数据的工具,融合了大多数进程监控命令的功能。

非系统自带工具,需要手动安装:

1
sudo yum insall dstat

使用方式及常见选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dstat [-afv] [options..] [delay [count]]

-c:显示cpu相关信息;
-d:显示磁盘的相关信息
-g:显示page相关的速率数据;
-m:Memory的相关统计数据
-n:Interface的相关统计数据;
-p:显示process的相关统计数据;
-r:显示io请求的相关的统计数据;
-s:显示swapped的相关统计数据;

--top-cpu:显示最占用CPU的进程;
--top-io:最占用io的进程;
--top-mem:最占用内存的进程;
--top-lantency:延迟最大的进程;

dstat 是很强大的工具,几乎集成了前面所说的进程监控命令的功能,可以快速找出需要的信息。具体可使用 man dstat 查看。

kill

kill - terminate a process.

这个就不用多说了,但是要清楚的是,不是所有的 kill 都是 kill 。 kill 命令只负责给进程发信号,但是要不要 kill ,是由信号决定的。

1
kill  [-s signal|-SIGNAL]  pid...

显示当前所有可用的信号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[hzz@magedu ~]$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[hzz@magedu ~]$

每个信号的标识方法有三种:

1.信号的数字标识;
2.信号的完整名称;
3.信号的简写名称;

常用信号:

1
2
3
4
5
6
1) SIGHUP :无须关闭进程而让其重读配置文件;
2) SIGINT :终止正在运行的前台进程,相当于 Ctrl+c ;
9) SIGKILL :杀死运行中的进程,强制终止;
15) SIGTERM :终止运行中的进程,通知进程终止(默认信号);
18) SIGCONT :将放入后台的进程继续运行;
19) SIGSTOP :将进程放入后台并转为停止,相当于 Ctrl+z ;

killall

killall - kill processes by name.

根据进程名来发送信号,和 pkill 的作用类似。

非系统默认自带工具,需手动安装:

1
sudo yum install psmisc

用法和 kill 类似,先指定 信号 ,再指定 进程

jobs

显示后台任务状态,一般用于查看使用 Ctrl + z 放入后台的任务,可不带选项直接使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[hzz@magedu ~]$ help jobs
jobs: jobs [-lnprs] [任务声明 ...] 或 jobs -x 命令 [参数]
显示任务状态。

列出活动的任务。JPBSPEC 限制仅输出指定的任务。
不带选项时,所有活动任务的状态都会显示。

选项:
-l 在正常信息基础上列出进程号
-n 列出上次通告之后改变了状态的进程
-p 仅列出进程号
-r 限制仅输出运行中的任务
-s 限制仅输出停止的任务

如果使用了 -x 选项,ARG 参数中的所有任务声明会被替换为该任务
的进程组头领的进程号,然后执行 COMMAND 命令。

退出状态:
返回成功,除非使用了无效的选项或者有错误发生。
如果使用 -x选项,则返回 COMMAND 命令的退出状态。
[hzz@magedu ~]$

jobs 命令一般配合 fgbgkill 来实现对后台任务的管理。

1
2
3
fg  [[%]JOB_NUM] :把指定的作业调回前台;
bg [[%]JOB_NUM] :让送往后台的作业在后台继续运行;
kill %JOB_NUM :终止指定的作业(必须加 % ,否则 kill 的是 pid ,而不是 job 编号);

nice

nice - run a program with modified scheduling priority.

自定义程序的调度优先级。

可通过 nice 值调整的优先级范围:100 - 139。
分别对应的 nice 值为:-20 - 19。
进程启动时,其 nice 值默认为0,其优先级是120。

执行方式:

1
nice [OPTION] [COMMAND [ARGU]...]

比如:

1
2
3
4
5
6
7
8
9
10
[hzz@magedu ~]$ nice -n 10 htop

1 [ 0.0%] Tasks: 30, 40 thr; 1 running
2 [| 0.7%] Load average: 0.00 0.01 0.05
Mem[|||||||||||||||||||||||||||||||||||| 193M/1.79G] Uptime: 1 day, 14:17:51
Swp[| 412K/2.00G]

PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
16623 hzz 30 10 119M 2372 1492 R 0.7 0.1 0:00.04 htop
...

可以看到 htop 的 NI 值变成了 10 。

注意:仅管理员可调低 nice 值。

renice

renice - alter priority of running processes.

调整已经运行的程序的 nice 值(需要指定 pid )。

执行方式:

1
renice [-n] NICE PID...

比如:

1
2
3
4
5
[hzz@magedu ~]$ renice -n 15 16643
16643 (进程 ID) 旧优先级为 0,新优先级为 15
[hzz@magedu ~]$ ps axo pid,ni|grep 16643
16643 15
[hzz@magedu ~]$

可以看到 16643 的进程优先级,被调整成了 15 。

总结

进程管理查看及管理工具愿不止以上提到的这些,还有例如 sartsariostatiftopnethog 等等许多不常用的命令没来得及介绍。这次就介绍到这,后续的命令如果有用到的,再详细介绍。