pstree 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于进程与系统族。排查"这个服务到底派生了哪些 worker/子进程"时,树状视图比平铺的 ps 直观得多。
一、常用法
bash
pstree # 整棵进程树(从 systemd/init 开始)
pstree -p # 显示 PID(最常用)
pstree -p 1234 # 只看 1234 及其子孙
pstree -a # 同时显示完整命令行参数
pstree -u # 标出进程有效用户变化的位置(如 root→www-data)
pstree -T # 不把同名线程折叠(默认多线程显示成 N*[{thread}])
pstree -s 5678 # 显示某进程的所有祖先链(向上溯源)
pstree -p -u nginx # 看 nginx master/workers 及运行用户默认会把同祖先的同名进程/线程合并显示(如
nginx─5*[nginx]表示 5 个 worker),这能让大树不刷屏;要逐个看 PID 加-p,要看线程细节加-T。
二、典型场景
- master-worker 模型:
pstree -p $(pidof nginx)一眼看清一个 master 带几个 worker;杀 worker 还是杀 master 影响不同(master 通常会重新拉起 worker)。 - 容器/服务:确认某 PID 的父进程是不是 containerd-shim、supervisord、systemd,判断进程谁在托管;父进程没了会被 init 收养(孤儿进程,PPID 变 1)。
- 僵尸进程定位:
pstree -p找到[name] <defunct>的父进程——僵尸是父进程没 wait 回收,要处理的是父进程(见僵尸进程 FAQ)。 - fork 风暴/子进程泄漏:树里某节点下挂大量同名子进程,定位派生失控。
三、与 ps --forest / pgrep 的区别
bash
ps -ef --forest # ps 自带树,但列宽信息多,不易聚焦某个子树
pgrep -P 1234 # 只列直接子进程 PID(脚本友好),不递归
ps -T -p 1234 # 列线程(TID),对应 pstree -Tpstree 胜在聚焦子树、合并同类、向上溯源(-s);脚本里精确取 PID 用 pgrep/ps -o pid= 更稳。
相关命令
总结
pstree -p 把进程按父子关系画成树:默认合并同名 worker/线程,-p 带 PID、-a 带命令行、-u 标用户切换、-s PID 向上找祖先;适合快速看清 master-worker 结构、容器进程归属、fork 风暴,并通过 defunct 的父节点定位僵尸进程根因;要脚本化取 PID 则用 pgrep/ps。