pstree 看进程关系
pstree 属于 psmisc,把系统里的进程按父子关系画成树形结构,一眼就能看出谁启动了谁。相比 ps aux 的平铺列表,它在回答「这个 worker 是谁的孩子」「某个守护进程 fork 出了多少子进程」这类问题时效率高得多。加上 -p 显示 PID、-a 显示参数、-u 标注用户切换、-s 显示祖先链,基本能覆盖日常排障需求。
基本信息
| 适用平台 | Linux(psmisc 包),macOS 可用 brew 安装 |
|---|---|
| 语法 | pstree [选项] [PID | 用户名] |
| 常用选项 | -p 显示 PID、-a 显示命令行参数、-u 显示用户变化、-s 显示祖链 |
| 相关工具 | ps --forest、systemctl status 的 cgroup 树 |
典型使用场景
- 确认某个服务进程的父进程是 systemd 还是被某个脚本拉起
- 排查僵尸进程时先看它们的父进程是谁
- 观察 nginx、php-fpm 之类的多进程模型有多少子进程
- 查看指定用户的进程树,判断是否越权启动了进程
- 找出 sudo 或 sshd 之下挂着的临时脚本进程
常用示例
常用示例
pstree -p | head -30 # 带 PID 看整体结构
pstree -p 1234 # 以某个 PID 为根展开子树
pstree -asp 1234 # 含祖先链与完整命令行参数
pstree -u www-data # 查看指定用户的进程树
pstree -c -p 1234 # 关闭同名合并,逐个列出每个 PID
pstree -T -p # 不显示线程,只看进程
pstree -h -p 1234 # 高亮当前进程及其祖先选项逐项读法
| 选项 | 作用 | 使用注意 |
|---|---|---|
| -p | 在每个节点后显示 PID | 不看 PID 时容易把同名进程混为一谈 |
| -a | 显示完整命令行参数 | 输出变长,宽终端或重定向到文件更合适 |
| -c | 不合并同名进程 | 默认把同名兄弟合成 3*[worker],要精确排查时加它 |
| -s | 从根到目标显示祖链 | 定位「谁拉起了它」的关键选项 |
| -u | 标注用户切换 | sudo、su 场景能看出权限边界 |
| -T | 隐藏线程 | 线程很多时输出可读性差别很大 |
| -n | 按 PID 排序 | 对比两次快照更容易看出变化 |
默认输出会把同名的兄弟进程合并成类似 3*[worker] 的写法,看上去只有三个进程其实可能更多,需要逐个核对时加 -c。
pstree 展示的是某一瞬间的快照,短命进程很容易错过;要抓一闪而过的进程,用循环采集或专门的追踪工具。