【注】具体详解参见 man 手册。
ps
是 Linux 下显示瞬间进程状态的强大命令,并不动态连续显示进程状态(top
命令则是对进程进行实时监控)。
ps [options]
Linux 系统中使用 ps
命令支持三种不同类型的命令行选项参数:
ps
),只显示运行在当前控制台下属于当前用户的进程。ps
命令会自动改变输出以模仿 BSD 格式。
选项参数 | 说明 |
---|---|
-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 命令的版本号 |
状态符号 | 说明 |
---|---|
R(TASK_RUNNING) | 正在运行或在运行队列中准备执行 |
S(TASK_INTERRUPTIBLE) | 可中断睡眠状态,因等待某事件发生而被挂起 |
D(TASK_UNINTERRUPTIBEL) | 不可中断(不响应异步信号,而不是不响应外部硬件中断)睡眠状态 |
I | 空闲内核线程 |
T(TASK_STOPPED or TASK_TRACED) | 暂停状态或跟踪状态(被作业控制信号暂停) |
t | 跟踪暂停状态(在跟踪调试过程中被调试器暂停) |
Z(EXIT_ZOMBIE) | 僵尸进程 |
X(EXIT_DEAD) | 退出状态,进程即将被销毁 |
W | 进程处于换页状态 |
显示控制程序和无终端程序:
ps -Na
本人终端显示结果如下:
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
......
选项参数 | 说明 |
---|---|
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 命令版本号 |
状态符号 | 说明 |
---|---|
< | 表明该进程运行在高优先级上 |
N | 表明该进程运行在低优先级上 |
L | 表明该进程有页面锁定在内存中 |
s | 表明该进程是控制进程 |
l | 表明该进程是多线程的 |
+ | 表明改进程运行在前台 |
按照父进程 ID 排序显示进程信息:
ps k ppid O ppid
本人终端显示结果如下:
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
选项参数 | 说明 |
---|---|
--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 排序显示进程信息:
ps --sort ppid --format pid,ppid,tty,cmd
本人终端显示结果如下:
PID PPID TT CMD
12429 3080 pts/4 bash
18446 12429 pts/4 ps --sort ppid --format pid,ppid,tty,cmd
O[+|-]key1[,[+|-]key2[,...]]
其中,+
表示顺序,-
表示逆序。
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 逆序输出所有进程信息:
ps -AFl O-p
本人终端结果如下:
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
......
[-]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 占用率,并且自定义分隔符:
ps -eo "%p -%y,%x %c"
本人终端结果如下:
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
......
[-]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
显示指定字段的进程信息:
ps -o pid,ppid,pgrp,comm
本人终端显示结果如下:
PID PPID PGRP COMMAND
6776 13466 6776 bash
6858 2307 6851 python3
9412 6776 9412 ps
# Unix 风格
ps -ef
ps -eF # 信息更加详细
# BSD 风格
ps ax
ps axu
ps -efH
ps -ef f # 层级结构更清晰
ps axf
ps -eLf
ps axms
ps -eM
ps -axZ