在 Linux 中,所有进程(除了初始进程 init 或 systemd)都是由其他进程通过 fork 和 exec 创建的子进程,这自然形成了一棵进程树。pstree 命令正是用来以树状结构直观展示当前系统中进程之间的父子关系。相比直接用 ps 查看进程列表,pstree 更容易让人一眼看出哪些进程是谁启动的,以及它们之间的层次依赖。
基本用法
直接在终端输入 pstree,会输出从 systemd(或 init)开始的整棵进程树:
pstree
示例输出(部分):
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─cron
├─dbus-daemon
├─sshd───sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
└─systemd-udevd
从输出中可以清楚看到 sshd 主进程下 fork 出了子 sshd 用于处理远程连接,该子进程又启动了 bash,而 bash 执行了 pstree 命令本身。
常用选项
- 显示 PID:
pstree -p
在每个进程名后附加进程 ID,这对于后续用 kill 管理进程非常直接。
pstree -p
输出示例:sshd(850)─┬─sshd(1234)───sshd(1235)───bash(1236)───pstree(4567)
- 显示特定进程的子树:
pstree <PID>或pstree <用户名>
只查看某个进程或其所属用户启动的进程树。
pstree 1234 # 只看 PID 1234 及其子孙进程
pstree john # 只看用户 john 的进程
- 紧凑或展开显示:
pstree -c(禁用压缩重复子进程)、-a(显示命令行参数)
有时 pstree 会将相同的子进程合并显示为 N*[进程名],用 -c 可以强制展开每个进程。-a 则会将启动命令的完整参数也显示出来,特别适合查看某服务的具体配置。
pstree -a
示例:sshd -D 或 nginx: master process /usr/sbin/nginx -g daemon on;
- 高亮当前进程:
pstree -h
通常会高亮显示当前 shell 所在进程及其祖先进程,方便定位自己在整棵树中的位置。
实用场景
- 理清服务启动关系:当某个守护进程出问题时,用
pstree可以迅速确认它是被systemd直接管理,还是由其他监控程序(如supervisord)拉起的。 - 发现孤儿或意外残留进程:如果某个父进程已经退出,但其子进程被
init收养,在树中会直接挂在systemd下面。这能帮助判断进程是否正常。 - 快速定位僵尸进程的父进程:结合
ps aux | grep Z找到僵尸进程 PID,再用pstree -s <PID>查看它的父进程是谁,从而找出没有妥善回收子进程的程序。 - 了解容器或命名空间进程结构:在容器内部运行
pstree通常只会显示以 PID 1 为根的进程树,可直接看清容器中实际运行的所有进程及层次。
pstree 的输出一目了然,既适合日常快速检查,也适合在脚本中与其他命令配合使用。当系统上运行着几十甚至几百个进程时,它比直线列表更能帮你理解进程间的“亲子关系”,是管理 Linux 系统时必备的轻量工具之一。