pstree 命令简介
pstree (Process Tree) 是一个非常有用的 Linux/Unix 命令行工具,它的主要功能是以树状图的形式显示系统中正在运行的进程,这个树状结构非常直观,可以清晰地展示出进程之间的父子关系。

当你想快速了解系统上有哪些主要的服务(进程),以及它们是如何相互关联的时,pstree 是一个绝佳的选择,它比单独使用 ps 命令更能让你把握整个进程体系的概览。
安装 pstree
在大多数现代 Linux 发行版中,pstree 通常是 ps 包的一部分,所以它通常已经预装了,如果没有,你可以使用以下命令进行安装:
-
在基于 Debian/Ubuntu 的系统上:
sudo apt-get install psmisc
-
在基于 RedHat/CentOS/Fedora 的系统上:
(图片来源网络,侵删)sudo yum install psmisc # 或者对于 dnf sudo dnf install psmisc
psmisc 包还包含了 pstree, killall, fuser 等实用工具。
基本语法
pstree [选项] [PID|USER|args]
- 选项: 用于控制输出的格式和内容。
- PID|USER|args (可选): 可以指定一个进程ID、用户名或命令行参数来限制显示的进程范围。
常用选项及示例
下面我们通过一些常见的选项来了解 pstree 的强大功能。
示例环境
为了演示,我们会在一个终端运行 sleep 1000 命令,并记住它的 PID(12345),然后在另一个终端使用 pstree。
默认显示
不带任何选项直接运行 pstree,它会以树状结构显示所有进程,通常将 init 或 systemd 作为根进程。

pstree
输出可能类似于这样(具体取决于你的系统):
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─accounts-daemon───2*[{accounts-daemon}]
├─acpid
├─atd
├─auditd───{auditd}
├─colord───2*[{colord}]
├─crond
├─dbus-da───{dbus}
├─firewalld───{firewalld}
├─...
├─sshd───sshd───bash───sleep 1000 <-- 我们新创建的进程
├─systemd───(sd-pam)
├─systemd-logind
├─...
└──2*[systemd]
从上面的输出中,你可以看到 sshd -> bash -> sleep 1000 这条清晰的父子链。
-p 或 --show-pids:显示进程ID
这是最常用的选项之一,因为它在树状结构旁边显示每个进程的 PID,方便你进行精确操作。
pstree -p
输出会包含 PID:
systemd(1)─┬─ModemManager(852)───{ModemManager}(853)
├─NetworkManager(855)───{NetworkManager}(856)
├─accounts-daemon(860)───{accounts-daemon}(861)
├─sshd(1234)───sshd(5678)───bash(9012)───sleep(12345) <-- PID 被显示出来了
└─...
-u 或 --show-user:显示进程所属用户
这个选项会显示每个进程的运行用户,对于排查权限问题非常有帮助。
pstree -u
输出会包含用户名:
systemd(root)─┬─ModemManager(root)───{ModemManager}(root)
├─NetworkManager(root)───{NetworkManager}(root)
├─accounts-daemon(root)───{accounts-daemon}(root)
├─sshd(root)───sshd(myuser)───bash(myuser)───sleep(myuser) <-- 用户被显示出来了
└─...
-a 或 --arguments:显示进程的完整命令行参数
默认情况下,pstree 只显示进程名,使用此选项可以看到进程启动时使用的完整参数。
pstree -a
输出会显示命令行:
systemd --switched-root --system --deserialize 22
└─sshd -D
└─sshd -p 22
└─bash -c sleep 1000
└─sleep 1000 <-- 完整的命令行被显示出来了
-h 或 --highlight-current:高亮显示当前进程
当你使用 pstree 查看特定进程树时,这个选项会用不同的颜色或高亮方式标出当前正在运行的进程(也就是 pstree 命令本身所在的进程树)。
# 首先找到你的 bash PID echo $$ # 假设输出是 9012 # 然后用该 PID 查看 pstree pstree -h 9012
你的 bash 进程及其所有父进程和子进程会被高亮显示。
-g 或 --ascii:使用 ASCII 字符而不是连线和符号
在某些终端或复制文本时,默认的 UTF-8 连线可能会出现问题,使用 -g 可以改用经典的 ASCII 字符(如 , , , \) 来绘制树状图。
pstree -g
-t 或 --thread:显示线程
在现代 Linux 系统中,很多进程是多线程的,此选项会深入到进程的内部,显示其线程,线程通常显示为进程名加方括号 []。
pstree -t
对于多线程的进程(如 java 或 nginx),你会看到类似 java───[java] 的输出。
-C 或 --color:控制颜色输出
可以指定颜色来区分不同类型的进程。
always: 总是使用颜色。never: 从不使用颜色。auto(默认): 如果输出到终端则使用颜色。
# 总是使用颜色 pstree -C always # 不使用颜色 pstree -C never
限制显示范围
你可以将 pstree 的输出范围限定为某个特定进程、特定用户或特定命令。
# 只显示与用户 'myuser' 相关的进程树 pstree myuser # 只显示 PID 为 12345 的进程及其子进程 pstree 12345 # 只包含名称中带有 'sshd' 的进程树 pstree sshd
实际应用场景
- 系统诊断:当系统变慢或无响应时,使用
pstree可以快速定位是否有异常的进程树(某个进程 fork 了大量的子进程)。 - 理解服务依赖:你可以看到
nginx进程是由systemd启动的,而systemd又是由内核启动的,这有助于你理解系统的启动和服务管理机制。 - 查找僵尸进程:虽然
pstree不会直接标记僵尸进程(Z状态),但如果一个进程下有大量名为defunct的子进程,那通常意味着存在僵尸进程,需要进一步用ps命令排查。 - 配合
kill或pkill使用:看到pstree的输出后,你可以更精确地决定要终止哪个进程,如果你想干掉整个sleep 1000及其父进程bash,你可以使用kill -9 9012(bash的 PID)。
| 选项 | 全称 | 描述 |
|---|---|---|
-p |
--show-pids |
显示每个进程的 ID。 |
-u |
--show-user |
显示每个进程的属主。 |
-a |
--arguments |
显示进程的完整命令行参数。 |
-h |
--highlight-current |
高亮显示当前进程。 |
-g |
--ascii |
使用 ASCII 字符绘制树状图。 |
-t |
--thread |
显示线程。 |
-C |
--color |
控制颜色输出。 |
-s |
--show-parents |
显示指定进程的直接父进程。 |
-n |
--numeric-sort |
按 PID 排序,而不是按名称。 |
-U |
--unicode |
使用扩展的 Unicode 字符绘制(默认)。 |
pstree 虽然简单,但它是系统管理员和开发者在日常工作中排查问题、理解系统运行状态的一把“瑞士军刀”,熟练掌握它能让你对 Linux 系统的进程管理有更深刻的理解。
