Linux 常用命令 - ps 【显示进程状态】
简介
ps 命令源于 “process status(进程状态)”,用于显示当前系统中的进程信息。它可以展示进程的诸多细节,如 PID(进程ID)、正在运行的命令名、CPU使用率、内存使用、运行时间等。基本原理是读取系统中与进程相关的数据,如 /proc
文件系统中的信息,并以用户友好的方式展示出来。
使用方式
ps [options]
简单的进程选择选项
a
:解除使用了 BSD 风格选项后被强制加上的“仅显示与自己相关的进程”限制,同时使用该选项选中的进程会与其他选项选中的进程一起显示。也可以理解为该选项会列出所有存在终端 (tty
) 的进程。与x
选项组合使用时可以列出所有进程。-A
:选择所有的进程。等价于-e
选项。-a
:选择所有除了没有关联终端的会话领导进程(session leaders)之外的所有进程。-d
:选择所有除会话领导进程之外的所有进程。--deselect
:反选进程(即选择所有不满足给出条件的进程)。等价于-N
选项。-e
:选择所有进程。-N
:反选进程。T
:选择所有与当前终端相关联的所有进程。等同于t
选项不带任何参数。r
:仅选择正在运行的进程。x
:解除使用了 BSD 风格选项后被强制加上的“必须关联一个终端”限制,同时使用该选项选中的进程会与其他选项选中的进程一起显示。也可以理解为该选项会列出所有属于你(与ps
的EUID
相同)的进程。与a
选项组合使用时可以列出所有进程。
列表式的进程选择选项
下面这些选项接受一个通过空格或逗号分隔的列表参数,并且支持多次使用。例如 ps -p "1 2" -p 3,4
。
-123
:等同于--pid 123
。123
:等同于--pid 123
。-C cmdlist
:通过命令名来选择进程。该选项会筛选出可执行文件名与cmdlist
中给出的相同的进程。需要注意的是命令名不等同于命令行的执行指令(可能包含选项、参数等)。在procps
和内核的早期版本中,命令名会被截断为 15 个字符,但这种限制在当前版本已经不存在了,这意味着如果你尝试通过截断的 15 个字符来匹配,那可能不会得到有效的匹配项。-G grplist
:通过真实组 ID(RGID)或名称来选择进程。该选项会筛选出那些真实组 ID 和名称与grplist
中给出的相同的进程。真实组 ID 是进程创建者所在组的 ID 。-g grplist
:通过会话或有效组名来选择进程。按会话来选择是许多标准规定的行为,而按有效组名进行选择是多种操作系统实际所采用的行为。当grplist
完全由数字组成时,ps
会基于会话来选择进程,因为会话的标识通常就是数字。只有同时指定了某些组名的情况下,组 ID 才会起作用。可以参考-s
和--group
选项。--Group grplist
:通过实际组 ID(RGID)或名称来选择进程。等同于-G
选项。--group grplist
:通过有效组 ID(EGID)或名称来选择进程。有效组表示进程的文件访问权限所属的组。通常该选项也可以用-g
来替代。p pidlist
:通过进程 ID 选择进程。等同与-p
和--pid
。-p pidlist
:通过进程 ID 来选择进程。等同于p
和--pid
。--pid pidlist
:通过进程 ID 来选择进程。等同于-p
和p
。--ppid pidlist
:通过父进程 ID 来选择进程。也就是选择pidlist
中列出进程的所有子进程。q pidlist
:通过 PID (快速模式)来选择进程。等同于-q
和--quick-pid
。-q pidlist
:通过 PID (快速模式)来选择进程。使用这个选项时,ps
命令只读取pidlist
列出的进程 ID 的必要信息,并且不会启用额外的过滤规则。同时pids
的顺序没有经过排序。因此,在这种模式下,不允许指定其他选择选项、排序以及树状结构的列表展示方式。等同于q
和--quick-pid
。--quick-pid pidlist
:通过 PID (快速模式)来选择进程。等同于q
和-q
。-s sesslist
:根据会话 ID 来选择进程。--sid sesslist
:根据会话 ID 来选择进程。等同于-s
。t ttylist
:根据终端(tty
)来选择进程。基本等同于-t
和-tty
,但也可以不指定 ttylist 来选择与当前ps
指令相关联的终端。不过这种情况下推荐直接使用T
选项。-t ttylist
:根据终端(tty
)来选择进程。选择所有与ttylist
中列出的终端相关的进程。终端可以用多种形式来表示,如dev/ttyS1
、ttyS1
、S1
。单独一个-
号则可以筛选出所有不与终端相关联的进程。--tty ttylist
:根据终端(tty
)来选择进程。等同于-t
和t
。U userlist
:根据有效用户 ID (EUID)或名称来选择进程。有效用户 ID 表示进程文件访问权限所属的用户 ID 。等同于-u
和--user
。-U userlist
:根据真实用户 ID (RUID)或名称来选择进程。真实用户 ID 表示创建该进程的用户 ID 。-u userlist
:根据有效用户 ID (EUID)或名称来选择进程。等同于U
和--user
。--User userlist
:根据真实用户 ID (RUID)或名称来选择进程。等同于-U
。--user userlist
:根据有效用户 ID (EUID)或名称来选择进程。等同于-u
和U
。
输出格式控制选项
下面这些选项用于选择 ps
显示的信息。
-c
:通常与-l
选项结合使用来显示不同的调度器信息。--context
:显示安全上下文格式,通常用于 SELinux 。-f
:显示完整格式的列表数据。该选项可以与其他许多类似的 UNIX 风格选项结合使用来增加额外的数据列。该选项还会使命令参数也被打印出来。当与-L
结合使用时,会添加NLWP
(线程数量)以及LWP
(线程ID)两列。-F
:启用增强的完整格式。在-f
的基础上加入更多额外的信息。--format format
:用户自定义格式。等同于-o
和o
选项。j
:使用 BSD 作业控制格式显示进程信息。-j
:显示作业格式的进程信息。l
:显示 BSD 长格式,包含更多的进程信息,如父进程 ID、会话 ID、优先级等。-l
:显示长格式,可以与-y
选项结合。-M
:为输出添加一列安全数据,与Z
选项相同(用于 SELinux)。O format
:该选项具有多种用途。BSD 的O
选项可以表现得像-O
(用户自定义输出格式,部分字段已经预定义)或可以用来指定排序顺序。ps
使用启发式方法来决定这个选项的具体行为。为确保得到预期的行为(排序或格式化),建议以其他方式指定这个选项,如-O
或--sort
。当作为格式化选项使用时,它与-O
完全相同,且具有 BSD 的特性。-O format
:类似于-o
但带有一些默认的数据列。等同于-o pid,format,state,tname,time,command
或-o pid,format,tname,time,cmd
。o format
:指定用户自定义输出格式,等同于-o
和--format
。-o format
:指定用户自定义输出格式。format
是一个由空格或逗号分隔的字符串列表,来表示你想显示的数据列。具体的关键字在下面的STANDARD FORMAT SPECIFIERS
中有详细描述。用户可以按需重命名列表标题,如ps -o pid,ruser=RealUser -o comm=Command
。如果所有列表标题都为空,如ps -o pid= -o comm=
,则不会输出标题行。输出列宽会根据需要自动增加以适应宽标题;例如ps -o pid,wchan=WIDE-WCHAN-COLUMN -o comm
会加宽WCHAN
列。同时,显式的列宽控制也是支持的,例如ps opid,wchan:42,cmd
。对于ps -o pid=X,comm=Y
,其输出行为会根据不同的系统特性变化,可能输出一个名为X,comm=Y
的列,也可能分别输出名为X
和Y
的两列。如果不确定具体的输出行为,推荐使用多个-o
选项来显示指定。PS_FORMAT
环境变量可以用来指定默认的输出格式。此外,DefSysV
以及DefBSD
这两个宏可以用来选择默认的 UNIX 或 BSD 列。s
:显示与进程相关的信号信息。u
:显示用户导向的格式(输出信息对用户更友好,更适合日常的监控)。v
:显示与进程相关的虚拟内存信息。X
:显示与进程相关的寄存器信息,通常用于实现底层调试。-y
:不显示进程标志,将addr
列替换为rss
。该选项只能和-l
结合使用。Z
:为输出添加一列安全数据,与M
选项相同(用于 SELinux)。
输出修饰符
c
:显示真实命令名称。这个名称来源于可执行文件的名称,而不是命令行的argv
参数。因此,命令的参数以及对其的任何修改都不会被显示。实际上这个选项是将args
格式关键字转换为了comm
格式关键字。其与-f
选项和各种 BSD 选项一起使用时比较有用,因为这些选项都通常会显示命令参数。--cols n
:设置屏幕宽度。--columns n
:设置屏幕宽度。--cumulative
:将一些已终止(dead)的子进程数据累计到父进程中。e
:显示进程的环境变量。f
:以 ASCII 图形形式显示进程的层次结构,便于分析进程间的父子关系。--forest
:以 ASCII 图形的形式显示进程的树状结构h
:不显示标题行(在 BSD 特性中为每页显示一个标题行)。该选项容易混淆,标准的 BSDps
使用该选项来实现每页打印一个标题行,但传统的 Linuxps
用该选项来完全禁用标题的输出。因此该选项的效果与当前系统有直接的关系,在默认使用 Linux 特性的系统中,你需要指定 BSD 特性才能实现每页一个标题行的功能。此外,无论你当前系统是什么,你都可以使用--headers
和--no-headers
来启用每页一个标题行或完全不打印标题行的功能。-H
:显示进程的层级结构。--headers
:每页都显示一个标题行(分页模式下)。k spec
:指定排序规则。排序语法为[+|-]key[,[+|-]key[,...]]
,从STANDARD FORMAT SPECIFIERS
章节中选择一个多字母的字段作为排序依据。+
是可选的,因为默认的排序方向是升序(数值或字典顺序)。等同于--sort
。以下为示例:ps jaxkuid,-ppid,+pid
ps axk comm o comm,args
ps kstart_time -ef
--lines n
:设置屏幕高度。n
:以数字形式显示WCHAN
和USER
字段的输出(包含所有的UID
和GID
类型)。--no-headers
:不显示标题行。--no-heading
是该选项的别名。O order
:O
选项在用作排序功能时,其语法是O[+|-]k1[,[+|-]k2[,...]]
(这是一个过时的选项语法),它基于下面OBSOLETE SORT KEYS
章节中一系列单字母短值k1,k2,...
指定的多级排序规则来对进程列表进行排序。+
是可选的,其只是重新说明了字段的默认方向(升序),不过有助于区分O
的排序或格式功能。-
仅对其紧跟的字段有效。--rows n
:设置屏幕高度。S
:将一些信息(例如 CPU 使用率)从已结束的子进程累积到它们的父进程中。其可以有效监测系统中是否有父进程在重复创建子进程。--sort spec
:等同于k
选项。w
:更宽的输出格式,使用两次可以解除输出宽度限制。-w
:更宽的输出格式,使用两次可以解除输出宽度限制。--width n
:设置屏幕宽度。
线程显示选项
H
:将线程作为进程显示。通常情况下,线程是进程的一部分,但在使用H
选项时,ps
会将每个线程都显示为一个独立的“进程”。这样可以更清楚地看到每个线程的状态。-L
:显示线程,可能会包含LWP
和NLWP
列。m
:在进程之后显示线程。-m
:在进程之后显示线程。-T
:显示线程,可能会包含SPID
列。
其他信息
--help section
:打印帮助信息,其中section
可以是simple, list, output, threads, misc, all
之一,也可以简写为s|l|o|t|m|a
。--info
:打印调试信息。L
:列出所有格式说明符。V
:打印procps-ng
工具包(ps
命令所属的工具包)的版本信息。-V
:打印procps-ng
工具包的版本信息。--version
:打印procps-ng
工具包的版本信息。
进程标志
ps
命令输出的 F
列显示了进程标志的总和。该列通过指定进程标志的输出说明符来显示(ps -eo pid,flags,comm
)。其值如下:
1
:进程是通过fork
创建但尚未调用exec
。4
:进程使用了超级用户权限。
进程状态码
当试用了 s
,stat
,state
这些输出说明符时(对应的表头为 STAT
或 S
),各字母对应的进程状态如下:
D
:不可打断的休眠(通常为 IO 操作)。I
:空闲的内核线程。R
:运行中或可运行(位于运行队列)。S
:可中断的休眠(等待事件完成)。T
:被作业(JOB)控制信号停止。t
:调试期间被跟踪器暂停(调试中停止)。W
:分页中(2.6.xx内核后无效)。X
:死亡进程(正常看不到)。Z
:僵尸进程,已被终止但没有被父进程回收。
BSD 格式下的附加状态如下:
<
:高优先级(对其他用户不友好)。N
:低优先级(对其他用户友好)。L
:存在内存页锁定(用于实时和自定义 IO)。s
:会话主导进程(session leader)。l
:多线程进程(使用CLONE_THREAD
,如NPTL pthreads)。+
:位于前台进程组。
OBSOLETE SORT KEYS(过时排序键)
这些键值用于 BSD 风格的 O
选项(用于排序功能)。GNU 风格的 --sort
选项已经不再使用这些键,转而使用下文 STANDARD FORMAT SPECIFIERS
章节中的标准格式说明符。需要注意在使用这些键值进行排序的时候 ps
依据的是内部原始数值,而非某些输出字段中显示的转化后的数值。(例如,tty
字段的排序是基于设备编号,而不是其显示的终端名称)。如果需要对显示值进行排序,可以通过管道将 ps
的输出传递给 sort
命令来处理。
键值对照表如下:
键值 | 长格式 | 描述 |
---|---|---|
c | cmd | 可执行文件的基础名称 |
C | pcpu | CPU 使用率百分比 |
f | flags | 长格式 F 字段标志位 |
g | pgrp | 进程组 ID |
G | tpgid | 控制终端的进程组 ID |
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 | 控制终端的设备编号 |
T | start_time | 进程启动时间 |
U | uid | 用户 ID 数字 |
u | user | 用户名 |
v | vsize | 虚拟内存总量(KiB ) |
y | priority | 核调度优先级数值 |
AIX FORMAT DESCRIPTORS(AIX 格式描述符)
对于支持 AIX 格式描述符的 ps
命令可以支持类似 printf
命令中的格式化符号。例如,通常情况下默认的输出可以用以下代码表示出来:
ps -eo "%p %y %x %c"
具体的符号对照表如下:
符号 | 默认输出项 | 列标题 |
---|---|---|
%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 |
STANDARD FORMAT SPECIFIERS(标准格式说明符)
下表是用于控制输出格式(如结合 -o
选项使用)或结合 GNU 风格的 --sort
选项来对选中的进程进行排序的不同关键字说明表。例如:
ps -eo pid,user,args --sort user`
本文中说明的 ps
(Ubuntu 22.04.5 LTS 自带版本)指令会尝试去识别大多数在其他 ps
实现中使用的关键字。
可能包含空格的用户自定义格式关键字有:args
、cmd
、comm
、command
、fname
、ucmd
、ucomm
、lstart
、bsdstart
、start
。
需要注意的是某些关键字可能不能用于排序。
关键字 | 列标题 | 描述 |
---|---|---|
%cpu | %CPU | 进程的 CPU 使用率,通常以 ##.# 格式显示。其计算方式是进程使用的 CPU 时间除以进程运行的总时间,以百分比形式显示。需要注意的是多个进程的使用率加起来不一定刚好等于 100% 。别名:pcpu 。 |
%mem | %MEM | 进程的常驻内存大小与机器物理内存大小的比值,以百分比形式显示。别名:pmem 。 |
args | COMMAND | 包含所有参数的完整命令字符串。命令的参数有可能被修改。该列的输出可能会包含有空格。如果进程标记为 ,说明该进程已经部分死亡(僵尸进程),等待其父进程完全销毁它。有时进程的参数可能无法获取,在这种情况下,ps 会显示可执行文件的名称,并用方括号将其包围。别名:cmd /command 。如果 args 是最后一列,它会自动拓展到终端窗口的最右边。但如果输出被重定向(例如通过管道到文件或其他命令),则无法确定显示宽度,此时实际的宽度可能为 80 、或无限制亦或由TERM 环境变量决定。用户可以通过 COLUMNS 环境变量或 --cols 以及 w 和 -w 选项来手动设置输出的宽度。 |
blocked | BLOCKED | 被阻塞信号的掩码。根据列宽显示 32 位或 64 位十六进制数字。 |
bsdstart | START | 命令启动时间。如果进程启动时间小于 24 小时,则按照 HH:MM 格式来显示,否则按照 Mmm:SS (Mmm 为英文月缩写,如 Jan/Feb 等)。 |
bsdtime | TIME | 累计的 CPU 时间(用户态+内核态)。常规的显示格式为 MMM:SS ,当进程的累计的时间超过 999 分钟时,显示会自动右对齐。 |
c | C | 处理器使用率,对进程生命周期内使用处理器的百分比数值取整显示。 |
caught | CAUGHT | 进程捕捉到的信号掩码。根据列宽显示 32 位或 64 位十六进制数字。别名:sig_catch /sigcatch 。 |
cgname | CGNAME | 进程所属控制组的名称。 |
cgroup | CGROUP | 进程所属控制组信息。 |
class | CLS | 进程调度类。别名:policy/cls 。该字段可能得值有:- : 未报告 TS :SCHED_OTHER FF :SCHED_FIFO RR :SCHED_RR B :SCHED_BATCH ISO :SCHED_ISO IDL :SCHED_IDLE DLN :SCHED_DEADLINE ? :未知 |
cls | CLS | 同 class 。 |
cmd | CMD | 同 args 。 |
comm | COMMAND | 命令名(仅显示可执行文件的名称)。对命令名的修改将不会被显示出来。如果进程标记为 ,则表示该进程已部分死亡,正在等待其父进程完全销毁。此列的输出可能包含空格。别名:ucmd /ucomm 。另请参阅 args 格式关键字、-f 选项和 c 选项。如果将 comm 指定为最后一列,它会自动拓展到终端窗口的最右边。但如果输出被重定向(例如通过管道到文件或其他命令),则无法确定显示宽度,此时实际的宽度可能为80、或无限制亦或由TERM 环境变量决定。用户可以通过 COLUMNS 环境变量或 --cols 以及 w 和 -w 选项来手动设置输出的宽度。 |
command | COMMAND | 同 args 。 |
cp | CP | CPU 使用率,以千分之一为单位显示。 |
cputime | TIME | 累计的 CPU 时间,格式为 [DD-]hh:mm:ss 。别名:time 。 |
cputimes | TIME | 累计的 CPU 时间,以秒为单位。别名:times 。 |
drs | DRS | 数据常驻集大小,指分配给可执行代码之外的数据的物理内存量。 |
egid | EGID | 进程的有效组 ID (Effective Group ID),以十进制整数表示。别名:gid 。 |
egroup | EGROUP | 进程的有效组 ID (Effective Group ID)。如果可以获取文本形式的组 ID 且字段宽度允许,则显示文本形式,否则显示十进制数。别名:group 。 |
eip | EIP | 指令指针。 |
esp | ESP | 栈指针。 |
etime | ELAPSED | 进程启动以来经过的时间,格式为 [[DD-]hh:]mm:ss 。 |
etimes | ELAPSED | 进程启动以来经过的时间,以秒为单位。 |
euid | EUID | 有效用户 ID (Effective User ID)。别名:uid 。 |
euser | EUSER | 有效用户名 (Effective User Name)。如果可以获取文本形式的用户 ID 且字段宽度允许,则显示文本形式,否则显示十进制数。可以使用 n 选项强制显示十进制数。别名:uname /user 。 |
f | F | 与进程关联的标志,详细可参阅“进程标志”章节。别名:flag /flags 。 |
fgid | FGID | 文件系统访问组 ID。别名:fsgid 。 |
fgroup | FGROUP | 文件系统访问组 ID。如果可以获取到文本形式的组 ID 并且字段宽度允许,则显示文本形式,否则显示十进制数。别名:fsgroup 。 |
flag | F | 同 f 。 |
flags | F | 同 f 。 |
fname | COMMAND | 进程可执行文件的基本名称的前 8 个字节。 此列中的输出可能包含空格。 |
fuid | FUID | 文件系统访问用户 ID。别名:fsuid 。 |
fuser | FUSER | 文件系统访问用户 ID。 如果可以获取到文本形式的用户 ID 并且字段宽度允许,则显示文本形式,否则显示十进制数。 |
gid | GID | 同 egid 。 |
group | GROUP | 同 egroup 。 |
ignored | IGNORED | 进程忽略信号的掩码。根据列宽显示 32 位或 64 位十六进制数字。别名:sig_ignore /sigignore 。 |
ipcns | IPCNS | 描述进程所属命名空间的唯一 inode 编号。 |
label | LABEL | 安全标签,通常用于 SELinux 上下文数据。用于高安全系统上的强制访问控制 (MAC) 策略。 |
lstart | STARTED | 命令启动的时间。另请参阅 bsdstart /start /start_time 和 stime 。 |
lsession | SESSION | 如果包含 systemd 支持,显示进程的登录会话标识符 |
luid | LUID | 显示与进程关联的登录 ID。 |
lwp | LWP | 可调度实体 (dispatchable entity) 的轻量级进程(线程)ID。别名:spid /tid 。 |
lxc | LXC | 任务运行所在的 LXC 容器的名称。如果进程未在容器内运行,则显示“- ”。 |
machine | MACHINE | 如果包含 systemd 支持,则显示分配给 VM 或容器的进程的机器名称。 |
maj_flt | MAJFLT | 此进程发生的主要页面错误 (major page fault) 的次数。 |
min_flt | MINFLT | 此进程发生的次要页面错误 (minor page fault) 的次数。 |
mntns | MNTNS | 描述进程所属挂载命名空间的唯一 inode 编号。 |
netns | NETNS | 描述进程所属网络命名空间的唯一 inode 编号。 |
ni | NI | nice 值(优先级)。范围从 19(最低优先级,最友善)到 -20(最高优先级,对其他进程不友善)。别名:nice 。 |
nice | NI | 同 ni 。 |
nlwp | NLWP | 进程中的 LWP(线程)数量。别名:thcount 。 |
numa | NUMA | 与最近使用的处理器关联的节点。-1 表示 NUMA 信息不可用。 |
nwchan | WCHAN | 进程正在休眠的的内核函数的地址(如果需要内核函数名称,请使用 wchan )。 正在运行的任务在此列中将显示“- ”。 |
ouid | OWNER | 如果包含 systemd 支持,则显示进程会话所有者的 Unix 用户标识符。 |
pcpu | %CPU | 同 %cpu 。 |
pending | PENDING | 挂起信号的掩码。进程级的挂起信号和线程级的挂起信号不同。使用 -m 或 m 选项可以同时查看两者。根据列宽显示 32 位或 64 位十六进制数字。 |
pgid | PGID | 进程组 ID,或者等效地,进程组领导者的进程 ID。别名:pgrp 。 |
pgrp | PGRP | 同 pgid 。 |
pid | PID | 代表进程 ID 的数字。别名:tgid 。 |
pidns | PIDNS | 描述进程所属进程 ID 命名空间的唯一 inode 编号。 |
pmem | %MEM | 同 %mem 。 |
policy | POL | 同 class 。 |
ppid | PPID | 父进程 ID。 |
pri | PRI | 进程的优先级。数字越大,优先级越低。 |
psr | PSR | 进程当前分配到的处理器。 |
rgid | RGID | 实际组 ID (Real Group ID)。 |
rgroup | RGROUP | 实际组名称 (Real Group Name)。如果可以获取文本形式的组 ID 且字段宽度允许,则显示文本形式,否则显示十进制数。 |
rss | RSS | 常驻集大小 (Resident Set Size),任务已使用的未交换物理内存(以千字节为单位)。别名:rssize /rsz 。 |
rssize | RSS | 同 rss 。 |
rsz | RSZ | 同 rss 。 |
rtprio | RTPRIO | 实时优先级。 |
ruid | RUID | 实际用户 ID (Real User ID)。 |
ruser | RUSER | 实际用户 ID (Real User ID)。如果可以获取文本形式的用户 ID 且字段宽度允许,则显示文本形式,否则显示十进制数。 |
s | S | 最简状态显示(一个字符)。具体的值请参见“进程状态代码”章节。别名:state 。 |
sched | SCH | 进程的调度策略。 策略 SCHED_OTHER (SCHED_NORMAL) 、SCHED_FIFO 、SCHED_RR 、SCHED_BATCH 、SCHED_ISO 、SCHED_IDLE 和 SCHED_DEADLINE 分别显示为 0 、1 、2 、3 、4 、5 和 6 。 |
seat | SEAT | 如果包含 systemd 支持,则显示与分配给特定工作场所的所有硬件设备关联的标识符。 |
sess | SESS | 会话 ID,或者等效地,会话领导者的进程 ID。别名:session /sid 。 |
sgi_p | P | 进程当前运行所处的处理器。如果进程目前不在运行或不可运行,则显示 * 。 |
sgid | SGID | 保存组 ID (Saved Group ID)。别名:svgid 。 |
sgroup | SGROUP | 保存组名称 (Saved Group Name)。如果可以获取文本形式的组 ID 且字段宽度允许,则显示文本形式,否则显示十进制数。 |
sid | SID | 同 sess 。别名:sess /session 。 |
sig | PENDING | 同 pending 。别名:pending /sig_pend 。 |
sigcatch | CAUGHT | 同 caught 。别名:caught /sig_catch 。 |
sigignore | IGNORED | 同 ignored 。别名:ignored /sig_ignore 。 |
sigmask | BLOCKED | 同 blocked 。别名:blocked /sig_block 。 |
size | SIZE | 如果进程要弄脏所有可写页面然后被交换出去,大概需要的交换空间量。这个数字非常粗略! |
slice | SLICE | 如果包含 systemd 支持,则显示进程所属的 slice unit。 |
spid | SPID | 同 lwp 。别名:lwp /tid 。 |
stackp | STACKP | 进程栈底(起始)的地址。 |
start | STARTED | 命令启动的时间。如果进程在 24 小时内启动,则输出格式为 HH:MM:SS ,否则为 Mmm dd (其中 Mmm 是月份的三字母缩写)。 |
start_time | START | 进程的启动时间或日期。如果进程不是在 ps 命令被调用的同一年启动的,则只显示年份;如果不是在同一天启动的,则显示 MmmDD ;否则,显示 HH:MM 。 |
stat | STAT | 多字符进程状态。有关不同值的含义,请参见“进程状态代码”章节。 如果只想显示第一个字符,另请参阅 s 和 state 。 |
state | s | 同 s 。别名:s 。 |
suid | SUID | 保存用户 ID。别名:svuid 。 |
supgid | SUPGID | 辅助组的组 ID(如果存在)。 |
supgrp | SUPGRP | 辅助组的组名称(如果存在)。 |
suser | SUSER | 保存用户名 (Saved User Name)。如果可以获取文本形式的用户 ID 且字段宽度允许,则显示文本形式,否则显示十进制数。别名:svuser 。 |
svgid | SVGID | 同 sgid 。别名:sgid 。 |
svuid | SVUID | 同 suid 。别名:suid 。 |
sz | SZ | 进程核心镜像的物理页面大小。 这包括文本、数据和堆栈空间。 目前不包括设备映射,后续可能会发生变化。 |
tgid | TGID | 代表任务所属线程组的数字。别名:pid 。它是线程组领导者的进程 ID。 |
thcount | THCNT | 进程拥有的内核线程数。同 nlwp 。别名:nlwp 。 |
tid | TID | 代表可调度实体的唯一数字。别名:lwp /spid 。此值也可能显示为:进程 ID (pid );进程组 ID (pgrp );会话领导者的会话 ID (sid );线程组领导者的线程组 ID (tgid );以及进程组领导者的 tty 进程组 ID (tpgid )。 |
time | TIME | 累计的 CPU 时间。格式为 [DD-]HH:MM:SS 。别名:cputime 。 |
times | TIME | 累计 CPU 时间,以秒为单位。别名:cputimes 。 |
tname | TTY | 控制终端(tty)。别名:tt /tty 。 |
tpgid | TPGID | 进程连接到的终端(tty)上的前台进程组的 ID,如果进程未连接到终端,则为 -1 。 |
trs | TRS | 文本常驻集大小 (Text Resident Set Size),分配给可执行代码的物理内存量。 |
tt | TT | 同 tname 。别名:tname /tty 。 |
tty | TT | 同 tname 。别名:tname /tty 。 |
ucmd | CMD | 同 comm 。别名:comm /ucomm 。 |
ucomm | COMMAND | 同 comm 。别名:comm /ucmd 。 |
uid | UID | 同 euid 。别名:euid 。 |
uname | USER | 同 euser 。别名:euser /user 。 |
unit | UNIT | 如果包含 systemd 支持,则显示进程所属的单元(unit)。 |
user | USER | 同 euser 。别名:euser /uname 。 |
userns | USERNS | 描述进程所属用户命名空间的唯一 inode 编号。 |
utsns | UTSNS | 描述进程所属主机/域名命名空间的唯一 inode 编号。 |
uunit | UUNIT | 如果包含 systemd 支持,则显示进程所属的用户单元(unit)。 |
vsize | VSZ | 同 vsz 。别名:vsz 。 |
vsz | VSZ | 进程的虚拟内存大小,以 KiB (1024 字节单位)为单位。目前不包括设备映射;这可能会发生变化。别名:vsize 。 |
wchan | WCHAN | 进程正在休眠的内核函数的名称。如果进程正在运行,则为 “- ”;如果进程是多线程的且 ps 未显示线程,则为 “* ”。 |
环境变量
以下环境变量可以影响 ps
的执行:
COLUMNS
:覆盖默认的显示宽度。LINES
:覆盖默认的显示高度。PS_PERSONALITY
:设置为posix
、old
、linux
、bsd
、sun
、digital
等之一(参见下文的“个性”章节)。CMD_ENV
:设置为posix
、old
、linux
、bsd
、sun
、digital
等之一(参见下面的“个性”章节)。I_WANT_A_BROKEN_PS
:强制使用过时的命令行解释方式。LC_TIME
:日期格式。PS_COLORS
:目前不支持。PS_FORMAT
:默认输出格式覆盖。可以将其设置为用于-o
选项的格式字符串。其中DefSysV
和DefBSD
这两个值非常有用。POSIXLY_CORRECT
:禁止忽略不良的“特性”,即要求必须遵守POSIX
标准。POSIX2
:设置为on
时,其行为与POSIXLY_CORRECT
相同。UNIX95
:禁止忽略不良的“特性”,即要求必须遵守UNIX95
标准。_XPG
:取消CMD_ENV=irix
的非标准行为。
一般来说,不是很推荐去设置这些变量。 唯一的例外是 CMD_ENV
或 PS_PERSONALITY
,对于普通系统,可以将其设置为 Linux。 如果没有此设置,ps
将遵循 Unix98 标准中无用且糟糕的部分。
PERSONALITY(个性化)
390
: 类似于 OS/390 OpenEdition 的ps
命令。aix
: 类似于 AIX 的ps
命令。bsd
: 类似于 FreeBSD 的ps
命令 (完全不符合标准)。compaq
: 类似于 Digital Unix 的ps
命令。debian
: 类似于旧的 Debianps
命令。digital
: 类似于 Tru64 (以前是 Digital Unix,OSF/1) 的ps
命令。gnu
: 类似于旧的 Debianps
命令。hp
: 类似于 HP-UX 的ps
命令。hpux
: 类似于 HP-UX 的ps
命令。irix
: 类似于 Irix 的ps
命令。linux
: 强烈推荐。old
: 类似于最初的 Linuxps
命令 (完全不符合标准)。os390
: 类似于 OS/390 Open Edition 的ps
命令。posix
: 符合标准。s390
: 类似于 OS/390 Open Edition 的ps
命令。sco
: 类似于 SCO 的ps
命令。sgi
: 类似于 Irix 的ps
命令。solaris2
: 类似于 Solaris 2+ (SunOS 5) 的ps
命令。sunos4
: 类似于 SunOS 4 (Solaris 1) 的ps
命令 (完全不符合标准)。svr4
: 符合标准。sysv
: 符合标准。tru64
: 类似于 Tru64 (以前是 Digital Unix,OSF/1) 的ps
命令。unix
: 符合标准。unix95
: 符合标准。unix98
: 符合标准。
参考示例
显示与当前终端关联的进程
ps
当直接运行 ps
命令不添加任何选项时,默认输出的内容较为简洁,仅显示与当前终端关联的进程(即由当前 Shell 启动的进程)。
jay@jaylinuxlenovo:~/test$ ps
PID TTY TIME CMD
35384 pts/7 00:00:00 bash
35786 pts/7 00:00:00 ps
以完整格式列出所有进程
ps -ef
使用 -e
选项可以显示所有进程,而 -f
选项可以显示完整的列表格式。结合两者使 ps
按照完整的列表格式显示所有的进程。
jay@jaylinuxlenovo:~/test$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:44 ? 00:00:05 /sbin/init
root 2 0 0 14:44 ? 00:00:00 [kthreadd]
root 3 2 0 14:44 ? 00:00:00 [rcu_gp]
root 4 2 0 14:44 ? 00:00:00 [rcu_par_gp]
root 5 2 0 14:44 ? 00:00:00 [slub_flushwq]
root 6 2 0 14:44 ? 00:00:00 [netns]
root 8 2 0 14:44 ? 00:00:00 [kworker/0:0H-events_highpri]
root 10 2 0 14:44 ? 00:00:00 [mm_percpu_wq]
root 11 2 0 14:44 ? 00:00:00 [rcu_tasks_rude_]
root 12 2 0 14:44 ? 00:00:00 [rcu_tasks_trace]
... 省略更多输出
最常用的显示所有运行中进程选项
ps aux
以更友好的形式显示所有用户、无论有没有关联终端的进程。也是通常情况下监测运行进程状态的最常用方式。
jay@jaylinuxlenovo:~/test$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 167320 12556 ? Ss 14:44 0:05 /sbin/init
root 2 0.0 0.0 0 0 ? S 14:44 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 14:44 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 14:44 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< 14:44 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< 14:44 0:00 [netns]
root 8 0.0 0.0 0 0 ? I< 14:44 0:00 [kworker/0:0H-events_highpri]
root 10 0.0 0.0 0 0 ? I< 14:44 0:00 [mm_percpu_wq]
root 11 0.0 0.0 0 0 ? S 14:44 0:00 [rcu_tasks_rude_]
... 省略更多输出
显示指定用户的进程
ps -u jay
使用 -u
选项可以指定一个用户,显示属于这个用户的进程。
jay@jaylinuxlenovo:~/test$ ps -u jay
PID TTY TIME CMD
10751 ? 00:00:00 systemd
10752 ? 00:00:00 (sd-pam)
11412 ? 00:00:00 sh
11416 ? 00:00:13 node
11460 ? 00:00:05 node
12046 pts/6 00:00:00 bash
30557 tty1 00:00:00 bash
32372 ? 00:00:00 sshd
32373 pts/1 00:00:00 bash
... 省略更多输出
显示指定命令的进程
ps -C node
使用 -C
选项可以显示可执行文件名与给定命令名相同的进程。
jay@jaylinuxlenovo:~/test$ ps -C node
PID TTY TIME CMD
11416 ? 00:00:13 node
11460 ? 00:00:06 node
35168 ? 00:00:16 node
35179 ? 00:00:00 node
显示指定 PID 的进程
ps -p 1
使用 -p
选项可以显示 PID 为指定数值的进程。
jay@jaylinuxlenovo:~/test$ ps -p 1
PID TTY TIME CMD
1 ? 00:00:06 systemd
显示指定终端名称的进程
ps -t tty1
使用 -t
选项可以显示其关联终端为指定名称的进程。
jay@jaylinuxlenovo:~/test$ ps -t tty1
PID TTY TIME CMD
30405 tty1 00:00:00 login
30557 tty1 00:00:00 bash
以更宽的输出形式显示进程信息
ps w
使用 w
选项可以使 ps
以更宽的输出形式输出进程信息,此时可能会输出进程完整的命令行参数及路径
jay@jaylinuxlenovo:~/test$ ps w
PID TTY STAT TIME COMMAND
12046 pts/6 Ss+ 0:00 /bin/bash --init-file /home/jay/.vscode-server/cli/servers/Stable-33fc5a94a3f99ebe7087e8fe79fbe1d37a251016/server/out/vs/workbench/contrib/te
30557 tty1 S+ 0:00 -bash
32373 pts/1 Ss+ 0:00 -bash
35384 pts/7 Ss 0:00 /bin/bash --init-file /home/jay/.vscode-server/cli/servers/Stable-33fc5a94a3f99ebe7087e8fe79fbe1d37a251016/server/out/vs/workbench/contrib/te
48472 pts/7 R+ 0:00 ps w
显示真实的进程名,而不带有命令的参数,简化输出
ps wc
使用 c
选项后可以显示可执行文件名而不带任何参数,从而简化输出内容。
jay@jaylinuxlenovo:~/test$ ps wc
PID TTY STAT TIME COMMAND
12046 pts/6 Ss+ 0:00 bash
30557 tty1 S+ 0:00 bash
32373 pts/1 Ss+ 0:00 bash
35384 pts/7 Ss 0:00 bash
47942 pts/7 R+ 0:00 ps
自定义输出字段并排序
ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu
使用 -o
选项后可以在后面跟一个格式说明符列表,来根据需求显示不同的进程信息字段。同时使用 --sort
还可以针对某个字段进行排序。
jay@jaylinuxlenovo:~/test$ ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu
PID PPID USER %CPU %MEM CMD
934 1 netdata 4.1 1.9 /usr/sbin/netdata -P /run/netdata/netdata.pid -D
1477 957 netdata 2.6 0.0 /usr/libexec/netdata/plugins.d/apps.plugin 1
948 1 root 1.6 1.0 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
35168 11416 jay 1.1 7.3 /home/jay/.vscode-server/cli/servers/Stable-33fc5a94a3f99ebe7087e8fe79fbe1d37a251016/server/node --dns-result-order=ipv4first /home/jay
745 1 root 1.0 0.0 /lib/systemd/systemd-logind
... 省略更多输出
注意事项
ps
命令通过读取/proc
中的虚拟文件来获取进程信息。并且不需要特殊权限(如setuid
或kmem
)就可以运行,因此不需要为其分配任何特殊权限。- CPU 使用率是进程在整个生命周期内占用 CPU 的时间百分比。这个数值并不理想,也不符合
ps
命令通常遵循的标准。并且这个使用率加起来可能不会正好等于 100%。 SIZE
和RSS
字段不会计算进程的页表、内核栈、内核数据结构(struct thread_info
和struct task_struct
),这些部分通常至少要占 20KiB 的内存。SIZE
表示进程的虚拟内存大小(code+data+stack
)。- 标记了
的进程是死进程,也称为“僵尸”进程,其存在的原因是它们的父进程没有有效清理这些进程。这些进程会在其父进程退出时由init
进程来清理。 - 如果用户名的长度超过了显示列的宽度,用户名会被截断。可以通过
-o
或-O
选项自定义输出格式,调整列宽以避免截断。 - 有些命令选项例如
ps -aux
是不推荐的,因为它混淆了两种不同的标准。根据 POSIX 和 UNIX 标准,上述命令指的是显示所有存在 TTY (通常是用户运行的命令)以及所有属于用户名为x
的用户的进程,如果这个用户不存在,那么ps
会假设你实际想运行的是ps aux
。 ps
命令显示的是一个时间点上的进程快照,不是实时的。