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,+pidps axk comm o comm,argsps 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命令显示的是一个时间点上的进程快照,不是实时的。
本文地址:https://www.vps345.com/9196.html

