要查看当前进程树的完整结构关系,必须使用 sudo pstree -p:默认 pstree 仅显示当前用户进程(等价于 pstree $USER),而 sudo pstree -p 以 systemd(1) 为根展示全系统所有进程及其真实父子关系,括号内 PID 可用于后续操作。

要查看当前进程树的完整结构关系,关键在于明确“完整”的定义:它指覆盖系统所有进程(含 root 启动的服务、内核线程、systemd 服务单元等),而不仅限于当前用户会话。默认运行 pstree 只显示当前用户的进程,这不是遗漏,而是设计行为。
用 sudo pstree -p 查看全系统进程树
这是最直接、最可靠的方式:
- 不加
sudo时,pstree等价于pstree $USER,只展示你启动的进程分支 - 执行
sudo pstree -p后,根节点为systemd(1)(或旧系统中的init(1)),所有进程按真实父子关系逐级展开 - 括号内的数字即 PID,可直接用于
kill、strace -p或查阅/proc/PID/
补充关键选项让结构更清晰
单靠 -p 已足够定位父子链,但结合以下选项能提升可读性与排查效率:
-
-u:显示用户名(如sshd(root)、bash(alice)),便于识别权限上下文 -
-a:显示完整命令行(如nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf),区分同名进程的不同实例 -
-s:反向追溯祖先(如pstree -s 1234输出systemd(1)───sshd(790)───bash(1234)),适合分析某个进程的启动源头 -
-l:避免长命令被截断,配合less -S滚动查看(sudo pstree -apl | less -S)
注意那些 pstree 看不见的进程
某些进程不会出现在宿主机的 pstree 输出中,不是命令失效,而是受限于 Linux 内核机制:
-
容器内进程:Docker 默认启用独立 PID namespace,
pstree只能看到containerd-shim或dockerd进程本身,看不到其内部的nginx、python。需进容器执行:docker exec -itpstree -p -
僵尸进程(Z 状态):已终止但父进程未回收,
pstree不显示,可用ps -eo pid,ppid,comm,state | awk '$4=="Z"'单独查找 -
刚 fork 尚未 exec 的进程:处于短暂中间态,
pstree可能跳过;此时用ps -eo pid,ppid,comm查原始字段更稳妥
没有 pstree 时的替代方案
在最小化系统(如 Alpine、某些容器镜像)中若未安装 procps-ng,可用 ps 模拟树状视图:
-
ps -eo pid,ppid,comm --forest:多数现代ps支持,效果接近pstree -p -
ps -eo pid,ppid,args | sort -n -k2:按 PPID 排序,手动观察缩进逻辑(PPID 为 1 的通常挂在 systemd 下) -
htop:安装后启动,按F5切换树状模式,支持鼠标交互和实时刷新











