ps 进程树展示是什么
ps 的 --forest 参数把进程按父子关系用缩进画成树形,一眼就能看出某个进程是谁拉起来的、下面还挂着哪些子进程。排查「这个后台任务属于哪个服务」、定位守护进程派生的 worker、或者要连带清理一整棵进程树时,这个视图比平铺列表高效得多。它依赖父进程号排序来画缩进,所以不要和其他排序参数混用;不想用 ps 也可以用系统里的 pstree 达到相近效果。
基本信息
| 适用平台 | GNU/Linux 的 procps-ng 版 ps(macOS 自带 ps 不支持该参数) |
|---|---|
| 语法 | ps -ef --forest 或 ps -eo pid,ppid,cmd --forest |
| 关键字段 | PID 进程号、PPID 父进程号、STAT 状态、CMD 命令行 |
| 替代命令 | pstree -p(按 PID 看子树) |
| 注意事项 | --forest 与其他排序参数混用会破坏树形结构 |
| 权限 | 普通用户即可,看他人进程详情受权限限制 |
典型使用场景
- 查某个服务或端口被谁拉起来:沿着树形结构向上找父进程。
- 清理遗留后台任务前确认整棵子树,避免只杀父进程留下一堆孤儿。
- 排查定时任务或启动脚本派生出来的进程,弄清楚它们的来源。
- 审计异常的进程树形态,例如某个 shell 下挂了大量可疑子进程。
- 写故障记录时附上有层级关系的输出,比平铺列表更容易理解。
常用写法
常用写法
ps -ef --forest | head -40 # 看进程树顶部结构
ps -eo pid,ppid,stat,cmd --forest | grep -B2 -A5 nginx # 关注 nginx 及上下文
ps -eo pid,ppid,cmd --forest | awk '$3==1' # 被 1 号进程收养的进程
ps -eo pid,ppid,cmd --forest | grep -A10 'systemd(1)' # 从 init 往下的主要分支
ps -eo pid,ppid,stat,cmd --forest | grep -i defunct # 找僵尸进程及其父进程
pstree -p 1234 # 以指定进程号为根看子树
ps -eo pid,ppid,cmd --forest | grep -E 'bash|sh' | head -20 # 找脚本派生的进程字段逐列读法
| 字段或现象 | 含义 | 判断要点 |
|---|---|---|
| PID | 进程号 | 后续查句柄、终止进程都用它 |
| PPID | 父进程号 | 为 1 说明原父进程已退出 |
| STAT | 进程状态 | Z 表示僵尸,D 表示不可中断等待 |
| CMD | 命令行 | 用于识别目标,注意同名进程 |
| 缩进层级 | 父子关系 | 缩进越深说明层级越靠下 |
| TTY 为问号 | 无控制终端 | 通常是从终端分离的守护进程 |
--forest 依赖父进程号排序来画缩进,混入排序参数后树形结构会被打乱,看起来像平铺列表却仍被当作层级视图解读,结论很容易出错。
孤儿进程会被 1 号进程收养,所以树里挂在 1 号进程下的陌生进程要重点核查,它们通常来自已经退出的脚本或异常的守护进程。
批量清理时按树操作更安全:先确认父进程与全部子进程,再按从叶到根的顺序终止,避免残留一代又一代的孤儿进程继续占用端口与资源。