pstree 是最省力可靠的进程树查看工具;它原生可视化父子关系,无需拼接字段,比 ps -ef | grep 更直观准确,支持缩进、PID显示(-p)、向上追溯(-s)、参数查看(-a)及ASCII兼容(-A)。

直接看进程树,pstree 是最省力也最可靠的方式;它不依赖额外工具、不需拼接字段,原生支持父子关系可视化。
为什么 pstree 比 ps -ef | grep 更适合看亲缘关系
ps 输出是扁平列表,父子关系靠 PPID 字段间接推断,容易漏看层级跳变;而 pstree 直接用缩进+连接符表达派生链路,一眼锁定“谁启动了谁”。比如 sshd 下挂多个 bash,再各自跑 ping 或 curl,pstree -p 能立刻呈现完整会话路径,ps 则需手动按 PPID 追溯。
常见错误现象:用 ps -ef | grep nginx 只看到几个进程名,却不知道它们是否同属一个 master 进程管理,也不知道 worker 是否被 systemd 直接拉起——pstree nginx 或 pstree -p | grep nginx 就能厘清。
-
pstree自动合并相同进程(如2*[nginx]),减少视觉噪音;加-c可禁用该行为,暴露每个独立实例 - 默认不显示 PID,排查时务必加
-p,否则无法和kill、strace等命令联动 - 非 root 用户执行时,可能看不到其他用户的进程(如
systemd --user会话),此时需sudo pstree -u补全视图
如何快速定位某个服务的完整启动链路
以排查 dockerd 启动异常为例:不是只找进程是否存在,而是确认它是否由 systemd 正常派生、有无预期的子进程(如 containerd、docker-proxy)。
实操建议:
- 先用
systemctl show --property=MainPID docker拿到主进程 PID,再执行pstree -p <pid></pid>,避免因服务名模糊匹配到无关进程 - 若要追溯父级,加
-s参数:pstree -ps 1234会向上显示从1234到systemd(1)的整条链 - 结合
-a查看启动参数:pstree -ap | grep dockerd能确认是否用了--data-root或--insecure-registry等关键配置
注意字符集与终端兼容性导致的显示错乱
某些老旧终端或 SSH 客户端(如部分 Windows 上的 PuTTY 配置)不支持 UTF-8 绘图字符,pstree 默认用 -U(UTF-8)可能导致分支线显示为方块或空白。这不是数据丢失,只是渲染失败。
解决方法很直接:
- 强制用 ASCII:加
-A参数,pstree -A -p输出稳定,符号统一为|、+、- - 禁用自动换行干扰:如果输出被截断或缩进错位,加
-l(long)避免行内换行破坏树形结构 - 别依赖颜色高亮:虽然
-h或-H <pid></pid>能标出当前或指定进程,但很多终端不支持 ANSI 颜色,优先靠位置和缩进来判断层级
真正容易被忽略的是:进程树的“根”未必是 systemd。容器内、chroot 环境或某些嵌入式系统中,PID 1 可能是 sh 或自定义 init,此时 pstree 显示的起点就变了——得先确认运行环境,再解读树形结构。


















