最准的进程树查看命令是 pstree -p。它用缩进和连接符直观展示派生链,如 sshd(790)───bash(1245)───curl(1267),无需手动比对 PID/PPID;查全系统需 sudo pstree -p,加 -u 标用户、-a 显完整命令行;可指定服务名或 PID 快速定位;注意线程(花括号)、合并显示(如 5*[nginx])及父进程退出后被 systemd 接管的情况。
直接用 pstree -p 最准。它用缩进和连接符天然表达派生链,比如 sshd(790)───bash(1245)───curl(1267),一眼就能看出 curl 是 bash 启动的,bash 又挂在 sshd 下。不需要手动比对 PID 和 PPID,也不会跳层漏看。
默认 pstree 只显示当前用户启动的进程,nginx、mysql、systemd 服务等根本不会出现——不是命令错了,是权限限制。哪怕你用 sudo systemctl start nginx 启动,worker 进程也不会出现在无权限的输出里。要看到完整树,必须运行:
sudo pstree -p-u 可标出所属用户:sudo pstree -pu
-a 显示完整命令行,区分同名但参数不同的进程(如两个 java 进程加载不同 jar)全系统树动辄上百行,靠眼睛找效率低。直接指定目标缩小范围:
pstree -p nginx(注意大小写,Nginx 不匹配)pstree -p 1234
pstree -s 1234,输出形如 systemd(1)───sshd(790)───bash(1234)
pstree 默认会隐藏线程、合并同名进程,容易误导:
{gdbus})是线程,不是独立子进程;加 -t 才显式显示5*[nginx] 表示 5 个同名进程,但不等于 5 个独立 fork 出来的 worker;需结合 ps -eo pid,ppid,comm 验证实际派生关系systemd(1) 下,大概率是父进程已退出、被 init 接管,此时应立刻补查 ps -eo pid,ppid,state 看原始状态