pstree 默认仅显示当前用户进程,需sudo pstree查看全系统进程树;容器内进程因pid namespace隔离不可见,须进容器执行;-s可反向追溯父链,ps --forest可模拟树状效果。

pstree 命令默认只显示当前用户的进程,不是全部进程
直接运行 pstree 会以树状结构展示当前终端用户启动的进程,但系统级进程(如 systemd、sshd、内核线程)默认不出现。这不是 bug,而是设计行为——它默认等价于 pstree $USER。
要看到完整进程树,必须显式加 -p(显示 PID)和 -u(显示用户)还不够,关键得加 -a 或更常用的是加 sudo:
-
sudo pstree—— 显示所有进程,根节点通常是systemd(或旧系统中的init) -
sudo pstree -p—— 同时显示 PID,方便定位具体进程 -
sudo pstree -p -u—— 还带用户名,适合多用户环境排查
为什么 pstree 不显示某些进程,比如 Docker 容器里的进程?
pstree 依赖 /proc 下的进程信息,而容器进程如果运行在独立 PID namespace 中(Docker 默认启用),宿主机上的 pstree 看不到它们的子树——只能看到容器 runtime(如 containerd-shim 或 dockerd)本身,看不到其内部的 nginx、python 等。
- 验证方式:运行
ps -ef | grep nginx可能查到,但pstree | grep nginx找不到 - 真正想看容器内进程树,得进容器执行:
docker exec -it <container> pstree -p</container> - 宿主机上可用
ps --forest -o pid,ppid,cmd辅助观察父子关系,它不依赖 namespace 视图
用 pstree 快速定位某个服务的主进程和子进程
比如查 nginx 的启动结构:先确认主进程名(注意不是所有服务都叫自己名字),再用 -s 参数反向追溯父链:
-
sudo pstree -p | grep nginx—— 粗略定位,但可能混在长行里看不清 -
sudo pstree -p -s nginx—— 直接从nginx往上翻父进程,输出类似:systemd(1)───nginx(1234)───nginx(1235) - 若提示
nginx: no process found,说明进程名不是nginx,试试pgrep -f nginx先找真实名称,常见还有nginx: master
这个 -s 对调试服务启停异常特别有用——能看出它是被 systemd 拉起的,还是被某个 shell 脚本 fork 出来的。
替代方案:pstree 没装时,用 ps 模拟进程树效果
有些最小化 Linux 系统(如 Alpine、部分容器镜像)没预装 pstree,又不想装 procps-ng 包。此时可以用 ps 配合排序和缩进模拟:
-
ps -eo pid,ppid,comm --forest—— 大多数现代ps支持--forest,效果接近pstree -
ps -eo pid,ppid,args | sort -n -k2—— 按 PPID 排序,手动看出父子关系(需脑补缩进) - 注意:
ps不自动过滤线程,如需排除,加-T参数后用grep -v " \["过滤掉内核线程
真正的坑在于:不同发行版的 ps 实现(procps vs busybox)对 --forest 支持不一,Alpine 上默认 ps 是 busybox 版,不支持该选项——这时只能靠 ps -eo pid,ppid,comm + 脚本解析。











