【注】具体详解参见 man 手册。

1. 简介

ps 是 Linux 下显示瞬间进程状态的强大命令,并不动态连续显示进程状态(top 命令则是对进程进行实时监控)。

2. 格式

1
ps [options]

Linux 系统中使用 ps 命令支持三种不同类型的命令行选项参数:

  • Unix 风格参数(参数前使用单破折线)
  • BSD 风格参数(参数前不使用破折线)
  • GNU 风格长参数(参数前加双破折线)

3. 选项

  • 默认情况下(不提供选项参数:ps),只显示运行在当前控制台下属于当前用户的进程。

  • 在使用 BSD 参数时,ps 命令会自动改变输出以模仿 BSD 格式。

3.1 Unix 风格

  • 选项参数
选项参数 说明
-A 显示所有进程,同 -e
-N 显示与指定参数不符的所有进程(默认显示除当前终端下的程序外所有程序),同 --deselect
-a 显示除控制进程和无终端进程外的所有进程
-d 显示除控制进程外的所有进程
-e 显示所有进程,同 -A
-C cmdlist 显示包含在 cmdlist 列表中的进程
-G grplist 显示组 ID 包含在 grplist 列表中的进程
-U userlist 显示属主用户 ID 包含在 userlist 列表中的进程,同 --User
-g grplist 显示会话或组 ID 在 grplist 列表中的进程(到底是会话 ID 还是有有效组 ID 取决与具体 Linux 发行版)
-p pidlist 显示 PID 在 pidlist 列表中的进程,同 p--pid
-s sesslist 显示会话 ID 在 sesslist 列表中的进程
-t ttylist 显示终端 ID 在 ttylist 列表中的进程,同 t--tty
-u userlist 显示有效用户 ID 在 userlist 列表中的进程,同 U--user
-F 显示更多额外输出(相较于 -f 参数)
-O format 显示默认的输出列以及 format 列表指定的特定列
-M 显示进程的安全信息
-c 显示进程的额外调度信息
-f 显示完整格式的输出
-j 显示任务信息
-l 显示长列表
-o format 仅显示由 format 指定的列,同 o--format
-y 不显示进程标记(process flag,表明进程状态)
-Z 显示安全标签(security context/label)信息
-H 用层级格式(树状格式,表明进程间的父子关系)来显示进程
-n namelist 设定名称列表文件路径(有些 Linux 发行版不支持)
-w 采用宽输出模式,不限宽度显示
-L 显示进程中的线程
-V 显示 ps 命令的版本号
  • Unix 风格为进程单字符状态码(输出为 S 列)
状态符号 说明
R(TASK_RUNNING) 正在运行或在运行队列中准备执行
S(TASK_INTERRUPTIBLE) 可中断睡眠状态,因等待某事件发生而被挂起
D(TASK_UNINTERRUPTIBEL) 不可中断(不响应异步信号,而不是不响应外部硬件中断)睡眠状态
I 空闲内核线程
T(TASK_STOPPED or TASK_TRACED) 暂停状态或跟踪状态(被作业控制信号暂停)
t 跟踪暂停状态(在跟踪调试过程中被调试器暂停)
Z(EXIT_ZOMBIE) 僵尸进程
X(EXIT_DEAD) 退出状态,进程即将被销毁
W 进程处于换页状态
  • 举例

显示控制程序和无终端程序:

1
ps -Na

本人终端显示结果如下:

1
2
3
4
5
6
7
PID   TTY         TIME      CMD
1 ? 00:00:02 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H
6 ? 00:00:00 mm_percpu_wq
7 ? 00:00:00 ksoftirqd/0
......

3.2 BSD 风格

  • 选项参数
选项参数 说明
T 显示跟当前终端关联的所有进程,同不带参数的 t
a 显示跟任意终端关联的所有进程
g 显示所有进程(包括控制进程)
r 仅显示运行中的进程
x 显示当前用户的所有进程,甚至包括未分配任何终端的进程(若和 a 连用则显示系统所有进程)
U userlist 显示属主用户 ID 包含在 userlist 列表中的进程
p pidlist 显示 PID 在 pidlist 列表中的进程
t ttylist 显示终端 ID 在 ttylist 列表中的进程
O format 显示默认的输出列以及 format 列表指定的特定列,同 -O
X 按过去的 Linux i386 寄存器格式显示
Z 将安全信息添加到输出中
j 显示任务信息
l 显示长列表
o format 仅显示由 format 指定的列
s 采用信号格式显示
u 采用基于用户的格式显示
v 采用虚拟内存格式显示
N namelist 设定名称列表文件路径(有些 Linux 发行版不支持)
O order 定义显示信息列的顺序,即指定输出信息排序规则(-O 没有此用法)
S 将数值信息从子进程加到父进程上(比如 CPU 和内存使用情况)
c 显示真实的命令名称(用以启动进程的程序名称)
e 显示命令使用的环境变量
f 用分层格式来显示进程(显示父子进程关系)
h 不显示头信息
k spec 指定用以将输出排序的列,同 --sort
n 用数值显示 WCHAN 和 USER 列
w 采用宽输出模式,不限宽度显示
H 将线程按进程来显示
m 在进程后显示线程
L 列出所有格式指示符(第一列用于 [-]o/O 后的 format 格式,第二列为输出对应显示的列名)
V 显示 ps 命令版本号
  • BSD 风格为进程多字符状态码(输出为 STAT 列):第一个状态码同 Unix 风格显示进程状态,其余字符进一步说明进程的状态。
状态符号 说明
< 表明该进程运行在高优先级上
N 表明该进程运行在低优先级上
L 表明该进程有页面锁定在内存中
s 表明该进程是控制进程
l 表明该进程是多线程的
+ 表明改进程运行在前台
  • 举例

按照父进程 ID 排序显示进程信息:

1
ps k ppid O ppid

本人终端显示结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
  PID  PPID S TTY          TIME COMMAND
3088 3080 S pts/0 00:00:00 bash
7869 3080 S pts/1 00:00:00 bash
10317 3080 S pts/2 00:00:00 bash
12429 3080 S pts/4 00:00:00 bash
22354 3080 S pts/6 00:00:00 bash
27861 3080 S pts/3 00:00:00 bash
21532 10317 S pts/2 00:00:00 man
16770 12429 R pts/4 00:00:00 ps
21542 21532 S pts/2 00:00:00 pager
27888 27861 S pts/3 00:00:00 man
27898 27888 S pts/3 00:00:00 pager

3.3 GNU 长参数风格

  • 选项参数
选项参数 说明
--deselect 显示与指定参数不符的所有进程(默认显示除当前终端下的程序外所有程序),同 -N
--Group grplist 显示组 ID 在 grplist 列表中的进程
--User userlist 显示用户 ID 在 userlist 列表中的进程
--group grplist 显示有效组 ID 在 grplist 列表中的进程
--pid pidlist 显示 PID 在 pidlist 列表中的进程
--ppid pidlist 显示父 PID 在 pidlist 列表中的进程
--sid sidlist 显示会话 ID 在 sidlist 列表中的进程
--tty ttylist 显示终端设备号在 ttylist 列表中的进程
--user userlist 显示有效用户 ID 在 userlist 列表中的进程
--format format 仅显示由 format 指定的列
--context 显示额外的安全信息
--cols/columns n 将屏幕宽度设置为 n
--cumulative 包含已停止的子进程的信息
--forest 用层级结构显示出进程和父进程之间的关系
--headers 在每页输出中都显示列的头
--no-headers 不显示列的头
--lines n 将屏幕高度设为 n
--rows n 将屏幕高度设为 n
--sort spec 指定将输出按哪列排序
--width n 将屏幕宽度设为 n
--help 显示帮助信息
--info 显示调试信息
--version 显示 ps 命令的版本号
  • 举例

按照父进程 ID 排序显示进程信息:

1
ps --sort ppid --format pid,ppid,tty,cmd

本人终端显示结果如下:

1
2
3
  PID  PPID TT       CMD
12429 3080 pts/4 bash
18446 12429 pts/4 ps --sort ppid --format pid,ppid,tty,cmd

4. 详解

4.1 BSD 风格 O order 参数

  • 格式
1
O[+|-]key1[,[+|-]key2[,...]]

其中,+ 表示顺序,- 表示逆序。

  • key 值表
key 全称 说明
c cmd 进程启动的程序名称
C pcpu CPU 利用率
f flags 长列表格式中的 F 列
g pgrp 进程组 ID
G tpgid tty进程组ID(为连接到 tty 则为 -1)
j cutime 累计用户时间
J cstime 累计系统时间
k utime 用户时间
m min_flt 次要页错误数
M maj_flt 主要页错误数
n cmin_flt 累计次要页错误数
N cmaj_flt 累计主要页错误数
o session 会话 ID
p pid 进程 ID
P ppid 父进程 ID
r rss 进程驻留内存占用空间大小
R resident 驻留内存页
s size 占用内存大小(KB)
S share 共享页数量
t tty 控制终端 tty 设备号
T start_time 进程启动至今所过时间
U uid 用户 ID
u user 用户名
v vsize 总占用虚拟内存空间大小(KB)
y priority 内核调度优先级
  • 举例

按照 PID 逆序输出所有进程信息:

1
ps -AFl O-p

本人终端结果如下:

1
2
3
4
5
6
7
F	S	UID	        PID	        PPID	C	PRI	NI	ADDR	SZ	WCHAN	RSS	    PSR	STIME	TTY	TIME	CMD
1 S zhangji+ 29974 4619 0 80 0 - 197384 futex_ 100904 3 20:20 ? 0:00 /opt/google/chrom
1 S zhangji+ 29953 4619 0 80 0 - 192882 futex_ 117896 3 20:20 ? 0:00 /opt/google/chrom
1 S zhangji+ 29923 4619 0 80 0 - 180153 futex_ 69972 1 20:20 ? 0:00 /opt/google/chrom
1 S zhangji+ 29885 4619 0 80 0 - 202766 futex_ 112476 2 20:20 ? 0:02 /opt/google/chrom
1 S zhangji+ 29856 4619 0 80 0 - 205781 futex_ 127136 6 20:20 ? 0:01 /opt/google/chrom
......

4.2 AIX 格式描述符

  • 格式
1
[-]o/O format

其中,format 为格式字符串(类似 printf 的格式,不同格式中间可自选分隔符)。

  • format 中可选格式列表如下:
格式 含义 输出列名
%C pcpu %CPU
%G group GROUP
%P ppid PPID
%U user USER
%a args COMMAND
%c comm COMMAND
%g rgroup RGROUP
%n nice NI
%p pid PID
%r pgid PGID
%t etime ELAPSED
%u ruser RUSER
%x time TIME
%y tty TTY
%z vsz VSZ
  • 举例

输出所有进程的 PID、TTY 号、当目前为止进程运行的累计 CPU 时间、CPU 占用率,并且自定义分隔符:

1
ps -eo "%p -%y,%x %c"

本人终端结果如下:

1
2
3
4
5
6
PID -TTY     ,    TIME COMMAND
1 -? ,00:00:02 systemd
2 -? ,00:00:00 kthreadd
4 -? ,00:00:00 kworker/0:0H
6 -? ,00:00:00 mm_percpu_wq
......

4.3 常用标准格式描述符

  • 格式
1
2
[-]o/O key1[=rename1|:width1][[[,| ][key2[=rename2|:width1]]...]
--sort [+|-]key1[,[+|-]key2[,...]]

其中,keyn 为指定格式描述符,renamen 为重命名输出列名,widthn 为指定输出列宽度,+ 表示顺序而 - 表示逆序。

  • 常用格式描述符列表
格式描述符 列名 说明
user/euser/uname USER/EUSER 有效用户名
uid/euid UID/EUID 启动进程的有效用户 ID
pid/tgid PID/TGID 进程 ID
ppid PPID 父进程 ID
pgid/pgrp PGID/PGRP 进程组 ID
c C 进程生命周期中的 CPU 利用率
%cpu/pcpu %CPU CPU 占用率
%mem/pmem %MEM 内存使用率
start/start_time/stime 进程启动时的系统时间
etime ELAPSED 进程启动至今经过的时间([DD-]HH:MM:SS 格式输出)
etimes ELAPSED 进程启动至今经过的时间(秒)
time/cputime TIME 当目前为止进程运行的累计 CPU 时间([DD-]HH:MM:SS 格式输出)
times/cputimes TIME 当目前为止进程运行的累计 CPU 时间(秒)
args/cmd/command CMD/COMMAND 进程启动的程序命令
comm/ucmd/ucomm COMMAND/CMD 进程启动的可执行文件名
tt/tty TT 进程启动时的终端设备
f/flag/flags F 内核分配给进程的系统标记
s/state S 进程单字符状态符
stat STAT 进程多字符状态符
pri PRI 进程优先级(值越大优先级越低)
ni/nice NI 谦让度,参与决定优先级
size SIZE 进程换出需要的交换空间大致大小
sz SZ 进程所占物理页大小
vsz/vsize VSZ 进程所占虚拟内存大小(KB)
rss/rssize/rsz RSS/RSZ 进程驻留内存占用空间大小(kB)
wchan WCHAN 进程休眠的内核函数名称(- 表示进程正在运行,* 表示为多线程进程)
  • 举例

按照自定义格式 pid,ppid,pgrp,comm 显示指定字段的进程信息:

1
ps -o pid,ppid,pgrp,comm

本人终端显示结果如下:

1
2
3
4
PID  PPID    PGRP    COMMAND
6776 13466 6776 bash
6858 2307 6851 python3
9412 6776 9412 ps

5. 常用参数组合

5.1 查看系统上运行的所有进程

1
2
3
4
5
6
# Unix 风格
ps -ef
ps -eF # 信息更加详细
# BSD 风格
ps ax
ps axu

5.2 采用层级结构显示系统上运行的所有进程

1
2
3
ps -efH
ps -ef f # 层级结构更清晰
ps axf

5.3 获取线程信息

1
2
ps -eLf
ps axms

5.4 获取安全信息

1
2
ps -eM
ps -axZ