ps、pstree、pgrep 命令详解
# ps:查看进程
ps(Process Status)命令用于查看系统当前进程状态。
语法格式:
ps [options]
1
ps 参数的格式具体如下:
- UNIX 格式:一个 “-” 开头。
- BSD 格式:没有 “-” 开头。
- GUN 长格式:两个 “-” 开头。
选项说明:
ps 命令的参数选项及说明:
参数说明 | 解释说明 |
---|---|
-a | 显示所有终端下执行的进程 |
a | 显示与终端相关的所有进程,包含每个进程的完整路径 |
x | 显示与终端无关的所有进程 |
u | 显示进程的用户信息 |
-u | 显示指定用户相关的进程信息 |
-e | 显示所有进程 |
-f | 额外显示 UID、PPID、C 与 STIME 栏位 |
f | 显示进程树 |
-H | 显示进程树 |
-l | 以详细的格式来显示进程的状况 |
-o | 自定义输出指定的字段,以逗号分隔 |
--sort key | key 表示为指定字段排序,默认升序,+key 升序,-key 降序 |
# 使用范例
# 1. ps 命令不接任何参数
[root@localhost ~]# ps
PID TTY TIME CMD
187113 pts/0 00:00:00 bash
187235 pts/0 00:00:00 ps
1
2
3
4
2
3
4
当 ps 命令不接任何参数时,输出的是使用者当前所在终端(窗口)的进程,其输入结果中的各项说明如下:
- PID 是进程的标识号。
- TTY 是进程所属的终端控制台。
- TIME 列是进程所使用的总的 CPU 时间。
- CMD 列是正在执行的命令行。
# 2. ps -ef
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2024 ? 00:01:42 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 2024 ? 00:00:00 [kthreadd]
root 4 2 0 2024 ? 00:00:00 [kworker/0:0H]
root 6 2 0 2024 ? 00:05:39 [ksoftirqd/0]
root 7 2 0 2024 ? 00:00:21 [migration/0]
root 8 2 0 2024 ? 00:00:00 [rcu_bh]
root 9 2 0 2024 ? 01:09:28 [rcu_sched]
root 10 2 0 2024 ? 00:00:00 [lru-add-drain]
root 11 2 0 2024 ? 00:00:23 [watchdog/0]
root 12 2 0 2024 ? 00:00:19 [watchdog/1]
root 13 2 0 2024 ? 00:00:22 [migration/1]
root 14 2 0 2024 ? 00:01:29 [ksoftirqd/1]
root 16 2 0 2024 ? 00:00:00 [kworker/1:0H]
root 18 2 0 2024 ? 00:00:00 [kdevtmpfs]
root 19 2 0 2024 ? 00:00:00 [netns]
root 20 2 0 2024 ? 00:00:03 [khungtaskd]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
输出信息中各列说明如下:
- UID:进程被该 UID 所拥有。
- PID:进程的标志号。
- PPID:进程的父进程的标志号。
- C:CPU使用的资源百分比。
- STIME:进程开始的时间。
- TTY:该进程是在哪个终端机上面运作,若与终端无关,则显示 "?" ,另外,tty1-tty6 是本机上面的登入者进程,若为 pts/0 等,则表示为由网络连接进主机的进程。
- TIME:进程所使用的总的 CPU 时间。
- CMD:正在执行的命令行。
ps 常常与 grep 组合使用,用于查找特定的进程。
# 3. ps aux
这里使用 BSD 语法格式显示每个进程信息。
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 191888 3828 ? Ss 2024 1:42 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 2024 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 2024 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 2024 5:39 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 2024 0:21 [migration/0]
root 8 0.0 0.0 0 0 ? S 2024 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 2024 69:28 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 2024 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 2024 0:23 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 2024 0:19 [watchdog/1]
root 13 0.0 0.0 0 0 ? S 2024 0:22 [migration/1]
root 14 0.0 0.0 0 0 ? S 2024 1:29 [ksoftirqd/1]
root 16 0.0 0.0 0 0 ? S< 2024 0:00 [kworker/1:0H]
root 18 0.0 0.0 0 0 ? S 2024 0:00 [kdevtmpfs]
root 19 0.0 0.0 0 0 ? S< 2024 0:00 [netns]
root 20 0.0 0.0 0 0 ? S 2024 0:03 [khungtaskd]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
输出信息中各列说明如下:
- USER:该进程属于的用户。
- PID:该进程的进程号。
- %CPU:该进程使用掉的CPU资源百分比。
- %MEM:该进程所占用的物理内存百分比。
- VSZ:该进程使用掉的虚拟内存量(单位为 Kbytes)。
- RSS:该进程占用的固定的内存量(单位为Kbytes)。
- TTY:该进程是在哪个终端机上面运作的,若与终端机无关,则显示 “?” ,另外,tty1-tty6 是本机上面的登入者进程,若为 pts/0 等,则表示为由网络连接进主机进程。
- STAT:该进程目前的状态,主要的状态包括如下几种。
- R:正在运行,或者是可以运行。
- S:正在中断睡眠中,可以由某些信号唤醒。
- D:不可中断睡眠。
- T:正在侦测或者是停止了。
- Z:已经终止了,但是其父进程无法正常终止它,从而变成僵尸🧟♀️进程的状态。
- +:前台进程。
- l:多线程进程。
- N:低优先级进程。
- <:高优先级进程。
- s:进程领导者。
- L:已将页面锁定到内存中。
- START:该进程被触发启动的时间。
- TIME:该进程实际使用CPU运行的时间。
- COMMAND:该进程的实际命令。
提示
Linux上进程的5种状态
- 运行(正在运行或在运行队列中等待)
- 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
- 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
- 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
- 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
# 4. ps -u root
显示指定用户的相关进程
[root@localhost ~]# ps -u root
PID TTY TIME CMD
1 ? 00:01:42 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H
6 ? 00:05:40 ksoftirqd/0
7 ? 00:00:21 migration/0
8 ? 00:00:00 rcu_bh
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 5. ps -l
详细显示进程状况
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 0 17643 24270 0 80 0 - 38324 - pts/0 00:00:00 ps
4 S 0 24270 24266 0 80 0 - 29151 do_wai pts/0 00:00:00 bash
1
2
3
4
2
3
4
# 6. 显示进程树
[root@localhost ~]# ps -eH # UNIX 格式,使用-e参数显示所有进程,-H显示进程树
......
1083 ? 00:00:22 master
1098 ? 00:00:04 qmgr
11423 ? 00:00:00 pickup
1201 ? 00:06:23 rsyslogd
1209 ? 00:00:00 atd
1214 ? 00:00:13 crond
1215 tty1 00:00:00 agetty
1216 ttyS0 00:00:00 agetty
1490 ? 00:00:07 sshd
24266 ? 00:00:04 sshd
24270 pts/0 00:00:00 bash
7703 pts/0 00:00:00 ps
25507 ? 00:00:09 bash
7702 ? 00:00:00 sleep
24268 ? 00:00:00 sshd
......
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# ps axf # BSD格式,a和x显示所有进程,f显示进程树
PID TTY STAT TIME COMMAND
2 ? S 0:00 [kthreadd]
4 ? S< 0:00 \_ [kworker/0:0H]
6 ? S 5:40 \_ [ksoftirqd/0]
7 ? S 0:21 \_ [migration/0]
8 ? S 0:00 \_ [rcu_bh]
9 ? S 69:34 \_ [rcu_sched]
10 ? S< 0:00 \_ [lru-add-drai
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
提示
或者使用 pstree
命令
# 7. 输出指定字段
AIX 格式:ps -eo "%p %y %x %c"
语法说明:-e 是显示所有进程,-o 表示可以自定义输出指定的字段,以逗号分隔,其支持的字段见下面的代码:
AIX FORMAT DESCRIPTORS 代码 标准含义 命令行表头内容 CODE NORMAL HEADER %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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18标准格式:ps -eo pid, user, args --sort pid
可以使用man ps 搜索 STANDARD FORMAT SPECIFIERS 详细了解
通常ps 命令可以使用--sort 排序,例如
--sort=-%cpu # 按照CPU占用率排序 - 号表示降序排序 --sort=-%mem # 按照内存占用率排序 --sort=-rss # 按照内存占用大小
1
2
3
下面是几个常用的查询例子:
查看指定进程的CPU和内存等信息占用
ps -p <PID> -o pid,ppid,cmd,%cpu,%mem,rss
1给输出排序
ps aux --sort=-%cpu ps aux --sort=-%mem
1
2
3给RSS转换为更容易理解的格式
ps -p <PID> -o rss | tail -n +2 | numfmt --to=iec
1
# pstree:显示进程状态树
语法格式:
pstree [option] [<PID>/<user>]
1
# 常用选项
-p
:显示每个进程的 PIDpstree -p
1-u
:显示每个进程的所属用户pstree -u
1-a
:显示每个进程的完整命令行pstree -a
1-c
: 如果有重复的进程名,则分开列出(默认情况下会合并)。pstree -c
1-g
: 以进程组为单位显示进程树。pstree -g
1-s
: 只显示指定进程及其子进程。pstree -s <PID>
1
# pgrep:查找匹配条件的进程
pgrep
用于根据进程名或其他属性查找正在运行的进程的 PID。
语法格式:
pgrep [option] [pattern]
1
选项:
-d, --delimiter <string>:指定输出的分隔符。
-l, --list-name:列出进程ID和进程名称。
-a, --list-full:列出进程ID和完整的命令行。
-v, --inverse:反向匹配,即只显示不匹配的进程。
-w, --lightweight:列出所有TID(轻量级线程)。
-c, --count:显示匹配的进程数量。
-f, --full:使用完整的进程名称进行匹配。
-g, --pgroup <PGID,...>:匹配指定的进程组ID。
-G, --group <GID,...>:匹配真实组ID。
-i, --ignore-case:忽略大小写进行匹配。
-n, --newest:选择最近启动的进程。
-o, --oldest:选择最早启动的进程。
-O, --older <seconds>:选择启动时间早于指定秒数的进程。
-P, --parent <PPID,...>:只匹配给定父进程的子进程。
-s, --session <SID,...>:匹配会话ID。
-t, --terminal <tty,...>:根据控制终端进行匹配。
-u, --euid <ID,...>:根据有效用户ID进行匹配。
-U, --uid <ID,...>:根据真实用户ID进行匹配。
-x, --exact:精确匹配进程名称。
-F, --pidfile <file>:从文件中读取PID。
-L, --logpidfile:如果PID文件没有锁定,则失败。
-r, --runstates <state>:匹配运行状态(D, S, Z等)。
--ns <PID>:匹配与指定PID相同命名空间的进程。
--nslist <ns,...>:列出将在 --ns 选项中考虑的命名空间。可用的命名空间包括:ipc、mnt、net、pid、user、uts。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
上次更新: 2025/04/09, 14:47:54