目录

12.2 进程管理命令

进程管理命令

/images/linux_mt/linux_mt.jpg

Linux系统上有众多进程查看及管理工具,不完全列示如下:

  1. 进程查看命令: pstree, ps, pidof, pgrep
  2. 进程管理命令: kill, pkill, killall
  3. 进程优先级调整: nice, renice

这些命令在我们以后的运维过程中都能用到,希望大家能熟练掌握。

1. 进程查看

1.1 pstree

pstree options

  • 作用: 以树状图的方式展现进程之间的派生关系
  • 选项:
    • -p: 显示程序 pid;
    • -u: 显示用户名称;
    • -n: 用 pid 排序,预设是以程序名称来排序;
    • -a: 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;
    • -c: 不使用精简标示法;
    • -G: 使用VT100终端机的列绘图字符;
    • -h: 列出树状图时,特别标明现在执行的程序;
    • -H<pid>: 此参数的效果和指定"-h"参数类似,但特别标明指定的程序;
    • -l: 采用长列格式显示树状图;
    • -U: 使用UTF-8列绘图字符;
    • -V: 显示版本信息

1.2 ps

ps 命令简介

在前面的 4.1 Linux目录机构 我们提到过,Linux 有两个伪文件系统 /proc,/sys

  • /proc/:
    • 是基于内存的虚拟文件系统,保存了内核及进程的相关信息;
    • /proc 内的内核参数分为两类:
      1. 状态变量: 其用于输出内核中统计信息或状态信息,仅用于查看
      2. 可设置其值从而调整内核运行特性的参数,位于 /proc/sys/,例如net.ipv4.ip_forward, 虚拟为net/ipv4/ip_forward, 存储于/proc/sys/, 因此其完整路径为/proc/sys/net/ipv4/ip_forward;
  • /sys/:
    • 用于挂载sysfs虚拟文件系统
    • 提供了一种比proc更为理想的访问内核数据的途径
    • 其主要作用在于为管理Linux设备提供一种统一模型的的接口;

Linux 进程的各种状态信息保存在 /proc 中以进程 PID 号命名的文件中。ps 命令即是通过读取 /proc/PID 目录内的文件,显示进程的相关信息。ps 命令选项有三种风格:

  1. UNIX 风格的参数,必需使用 -
  2. BSD 风格的参数, 不能使用 -
  3. GNU 风格的长选项, 使用--开头

ps 使用

ps [options]:

  • 作用: report a snapshot of the current processes.
  • BSD 选项:
    • a: 所有与终端相关的进程;
    • x: 所有与终端无关的进程;
    • u: 以用户为中心组织进程状态信息显示;
    • U<uname>: 显示特定用户进程
    • -o/o field1, field2,...:
      • 可以加 - 也可以不加
      • 用于自定义要显示的字段列表,字段列表以逗号分隔;
      • 常用的field: pid, ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio
  • UNIX 选项:
    • -e: 显示所有进程
    • -f: 显示完整格式的进程信息
    • -F: 显示完整格式的进程信息,与 -f 显示的字段略不同
    • -H: 以层级结构显示进程的相关信息;
    • -U<uid>: 显示特定用户进程
    • -u<uid>: 显示特定用户进程
  • 常用组合之一:
    • ps aux
    • ps -ef
    • ps -eFH
    • ps -eo, ps axo

ps aux

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
tao@hp:~$ ps aux |head -10
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 194436  9136 ?        Ss   08:49   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2  0.0  0.0      0     0 ?        S    08:49   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    08:49   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   08:49   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        S    08:49   0:03 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    08:49   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    08:49   0:01 [rcuos/0]
root        10  0.0  0.0      0     0 ?        S    08:49   0:00 [rcuob/0]
root        11  0.0  0.0      0     0 ?        S    08:49   0:00 [migration/0]
  • %CPU: CPU 占用百分比
  • %MEM: 内存占用百分比
  • VSZ: 虚拟内存集;
  • RSS: Resident Size,常驻内存集;
  • TTY: 进程所属终端
  • STAT: 进程状态
    • R: running,运行中
    • S: interruptable sleeping,可中断睡眠
    • D: uninterruptable sleeping,不可中断睡眠
    • T: Stopped,停止状态
    • Z: zombie,僵尸进程
    • +: 前台进程
    • l: 多线程进程
    • N: 低优先级进程
    • <: 高优先级进程
    • s: session leader,管理着多个其他进程的进程
  • START: 开始运行时间
  • TIME: 进程累积实际使用CPU时间片之和

ps -ef

1
2
3
4
5
6
7
8
tao@hp:~$ ps -ef|head -10
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:49 ?        00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2     0  0 08:49 ?        00:00:00 [kthreadd]
root         3     2  0 08:49 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 08:49 ?        00:00:00 [kworker/0:0H]
root         7     2  0 08:49 ?        00:00:03 [rcu_sched]
root         8     2  0 08:49 ?        00:00:00 [rcu_bh]
  • PPID: 父进程的 pid
  • C: cpu utilization, CPU 占用率
  • STIME: 开始运行时间
  • TIME: 进程累积实际使用CPU时间片之和

ps -eFH

1
2
3
4
5
6
7
tao@hp:~$ ps -eFH|head -10
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root         2     0  0     0     0   2 08:49 ?        00:00:00 [kthreadd]
root         3     2  0     0     0   0 08:49 ?        00:00:00   [ksoftirqd/0]
root         5     2  0     0     0   0 08:49 ?        00:00:00   [kworker/0:0H]
root         7     2  0     0     0   3 08:49 ?        00:00:03   [rcu_sched]
root         8     2  0     0     0   0 08:49 ?        00:00:00   [rcu_bh]
  • C: cpu utilization, CPU 占用率
  • SZ: VSZ 虚拟内存集;
  • RSS: Resident Size,常驻内存集;
  • PSR: 进程运行于哪颗CPU之上
  • STIME: 开始运行时间
  • TIME: 进程累积实际使用CPU时间片之和

ps -eo|axo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
tao@hp:~$ ps -eo user,uid,nice,priority,psr,pcpu,stat,rtprio,cmd,tty,ppid
USER       UID  NI PRI PSR %CPU STAT RTPRIO CMD                         TT        PPID
root         0   0  20   0  0.0 Ss        - /usr/lib/systemd/systemd -- ?            0
root         0   0  20   2  0.0 S         - [kthreadd]                  ?            0
root         0   0  20   0  0.0 S         - [ksoftirqd/0]               ?            2
root         0 -20   0   0  0.0 S<        - [kworker/0:0H]              ?            2
root         0   0  20   0  0.0 S         - [rcu_sched]                 ?            2
root         0   0  20   0  0.0 S         - [rcu_bh]                    ?            2
root         0   0  20   2  0.0 S         - [rcuos/0]                   ?            2
root         0   0  20   0  0.0 S         - [rcuob/0]                   ?            2
root         0   - -100  0  0.0 S        99 [migration/0]               ?            2

ps -eo user, uid, nice, priority, psr, pcpu, stat, rtprio, cmd, tty, ppid

  • ni/nice: nice值
  • priority: priority, 优先级
  • psr: PSR 进程运行于哪颗CPU之上
  • pcpu: %CPU cpu 占用百分比
  • stat: STAT 进程状态
  • rtprio: real time priority,实时优先级

1.3 pgrep

pgrep [options] pattern

  • 作用: 通过进程名或其他属性查找进程
  • 参数: pattern 匹配进程名的模式
  • 选项
    • -l: 显示进程名;
    • -a: 显示完整格式的进程名;
    • -u uid: effective user,有效用户
    • -U uid: real user,实际用户
    • -t TERMINAL: 与指定的终端相关的进程;
    • -P pid: 显示此进程的子进程;
    • -o:仅显示找到的最小(起始)进程号;
    • -n:仅显示找到的最大(结束)进程号;
1
2
3
4
5
6
7
8
tao@hp:~$ pgrep -la htt*
13163 /usr/sbin/httpd -DFOREGROUND
13169 /usr/sbin/httpd -DFOREGROUND
13172 /usr/sbin/httpd -DFOREGROUND
13173 /usr/sbin/httpd -DFOREGROUND
13177 /usr/sbin/httpd -DFOREGROUND
13178 /usr/sbin/httpd -DFOREGROUND
13180 /usr/sbin/httpd -DFOREGROUND

1.4 pidof命令:

pidof [options] program [program..]

  • 作用: 根据进程名,取其进程 pid
  • 参数: program 进程名称
  • 选项:
    • -s:仅返回一个进程号;
1
2
tao@hp:~$ pidof httpd
13180 13178 13177 13173 13172 13169 13163

2. 进程管理

kill 类命令可以向进程发送信号,以实现对进程管理。Linux 中每个信号的标识方法有三种:

  1. 信号的数字标识;
  2. 信号的完整名称;
  3. 信号的简写名称;
1
2
3
4
5
#  HUP = SIGHUP = 1
tao@hp:monitor$ kill -l 1
HUP
tao@hp:monitor$ kill -l SIGHUP
1

2.1 kill

查看信号类型

kill -l [signal]

  • 作用: 查看信号类型
  • 参数: signal 待查看的信号类型,可选,默认显示所有信号
  • 常用信号:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
tao@hp:monitor$ 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

tao@hp:monitor$ kill -l 1
HUP
tao@hp:monitor$ kill -l SIGHUP
1

发送信号管理进程

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

  • 作用: 用于向进程发送信号,以实现对进程的管理
  • 选项:
    • -s signal|-SIGNAL: 指明要发送的信号
    • -p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
    • -u:指定用户
  • 常用信号:
    • 1) SIGHUP: 无须关闭进程而让其重读配置文件;
    • 2)SIGINT: 终止正在运行的进程,相当于Ctrl+c
    • 9)SIGKILL: 杀死运行中的进程;
    • 15)SIGTERM: 终止运行中的进程;
    • 18)SIGCONT: 启动暂停的进程
    • 19)SIGSTOP: 暂停进程
1
2
3
4
kill -9 1999
kill -s 9 1999
kill -SIGKILL 1999
kill -KILL 1999

2.2 killall

killall [-SIGNAL] program

  • 作用: 使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程
  • 参数: program 进程名称
  • 选项:
    • -e:对长名称进行精确匹配;
    • -l:忽略大小写的不同;
    • -p:杀死进程所属的进程组;
    • -i:交互式杀死进程,杀死进程前需要进行确认;
    • -l:打印所有已知信号列表;
    • -q:如果没有进程被杀死。则不输出任何信息;
    • -r:使用正规表达式匹配要杀死的进程名称;
    • -s signal|-SIGNAL:指定发送的信号
    • -u:杀死指定用户的进程。

2.3 pkill

pkill [options] pattern

  • 作用: 通过进程名或其他属性向进程发送信号,用法与 pgrep 类似
  • 选项:
    • -u uid: effective user,向指定的有效用户发送信号
    • -U uid: real user,向指定的实际用户发送信号
    • -t TERMINAL: 向指定的终端相关的进程发送信号;
    • -P pid: 向此进程的子进程发送信号
    • -g:指定进程组;
    • -o:仅向找到的最小(起始)进程号发送信号;
    • -n:仅向找到的最大(结束)进程号发送信号;

3. 进程优先级调整

Linux 中进程优先级别为0-139:

  • 1-99:实时优先级;
  • 100-139:静态优先级,Nice值用于调整静态优先级。

需要注意的是,优先级越靠近 99,优先级越高。可以通过调整 Nice 值调整程序优先级。普通用户只能调高优先级(即降低程序优先级),不能调高优先级。root 可以调高或调低。进程启动时,nice值默认为0,优先级是120,可通过nice值调整的优先级范围是 100-139,nice值分别对应于-20, 19

诸多命令都可以查看进程的优先级与 nice 值,比如 ps axo pid, ni, priority, comm

nice

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

  • 作用: 以指定的nice值启动并运行命令
  • 参数:
    • COMMAND: 要执行的命令,如果没给 COMMAND, 显示当前进程的优先级
    • ARGU: 传递给 COMMAND 的参数
  • 选项:
    • -n NICE: 指定优先级,默认为 5
  • 注意:仅管理员可调低nice值;

renice

renice [-n] NICE PID...

  • 作用: 更改已经运行用户的优先级
  • 参数:
    • NICE: 新 nice 值
    • PID: 进程PID

4. 未涉及到的命令:

sar, tsar, iostat, iftop, nethog, …