pstree命令详解

pstree 是一个在 Linux/Unix 系统上非常有用的命令行工具,它以树状图的形式直观地展示系统中正在运行的进程,清晰地揭示进程之间的父子关系和层级结构。通过这种可视化的方式,可以比 ps 命令输出的线性列表更容易理解系统进程的全貌。

bash 复制代码
用法:pstree [-acglpsStTuZ] [ -h | -H 进程号 ] [ -n | -N 类型 ]
              [ -A | -G | -U ] [ 进程号 | 用户 ]
  或:pstree -V

显示进程树。

  -a, --arguments     显示命令行参数
  -A, --ascii         使用 ASCII 行绘制字符
  -c, --compact-not   不要对完全相同的子树进行压缩
  -C, --color=类型    按照指定属性对进程上色
                      (age)
  -g, --show-pgids    显示进程组 ID;隐含启用 -c 选项
  -G, --vt100         使用 VT100 行绘制字符
  -h, --highlight-all 高亮显示当前进程和其所有祖先
  -H PID, --highlight-pid=PID
                      高亮显示指定 PID 对应的进程和其所有祖先
  -l, --long          不要截断长行
  -n, --numeric-sort  按照 PID 对输出进行排序
  -N 类型, --ns-sort=类型
                      按照指定命名空间类型对输出进行排序
                              (cgroup, ipc, mnt, net, pid, time, user, uts)
  -p, --show-pids     显示 PID;隐含启用 -c 选项
  -s, --show-parents  显示所选进程的父进程
  -S, --ns-changes    显示命名空间的变化
  -t, --thread-names  显示完整线程名称
  -T, --hide-threads  隐藏线程,只显示进程
  -u, --uid-changes   显示用户 ID(UID)的变化
  -U, --unicode       使用 UTF-8(Unicode)的行绘制字符
  -V, --version       显示版本信息
  -Z, --security-context
                      显示安全属性

  进程号 从指定进程号开始;默认为 1(init)
  用户   仅显示从指定用户的进程开始的进程树

核心功能:默认用法与基础选项

pstree 最常见的用法是直接执行,不带任何参数。它会以 init 或 systemd(PID 为 1)进程为根,显示系统中所有的进程树。

bash 复制代码
pstree

执行后,你会看到类似下面的输出,树形结构清晰地展示了进程间的派生关系-1

bash 复制代码
init-+-getty
     |-getty
     |-getty
     `-getty

为了让信息更丰富,有几个常用选项很值得了解:

  • -p:显示进程ID(PID):在每个进程名后面以括号形式显示其 PID,这对定位特定进程非常关键。

  • -u:显示用户ID变化:当进程的 UID 与父进程不同时,会在进程名后显示新的 UID,有助于观察权限切换情况。

  • -a:显示命令行参数:不仅显示进程名,还显示启动时使用的完整命令和参数,能更准确地识别进程。

关键特性:自动合并相同分支

pstree 的一个实用设计是自动合并完全相同的子进程分支,并用方括号和数字表示重复次数,使输出更紧凑、易读。

例如,如果系统有 4 个 getty 进程,默认显示会被精简为:

bash 复制代码
init---4*[getty]

若想禁用此特性,显示完整的树状结构,可以使用 -c 选项。

定位与筛选:查看特定进程的信息

  • 指定PID或用户名:在命令后直接加上 PID 或用户名,可以只查看该进程及其子进程,或该用户拥有的所有进程树。

  • -s:显示父进程:查看指定进程的父进程链,对于追溯进程来源非常有帮助。

  • -h-H <PID>:高亮显示当前进程(或指定 PID 的进程)及其所有祖先进程,便于在复杂树中快速定位。

进阶选项:深入探索

  • -g:显示进程组ID(PGID):显示每个进程所属的进程组 ID,常用于作业控制分析。

  • -t:显示线程名 :在父进程下显示其子线程,线程名会放在花括号 {} 中。使用 -T 则相反,会隐藏所有线程。

  • -n:按PID排序:默认按进程名排序,此选项会让同一父进程下的子进程按 PID 数值排序。

  • -l:显示长行:默认输出会根据终端宽度截断,此选项可显示完整信息。

  • -Z:显示安全上下文:在支持 SELinux 的系统上显示进程的安全上下文。

  • 绘图字符选项-A (ASCII字符)、-G (VT100字符)、-U (Unicode/UTF-8字符) 可用于适应不同终端环境。

实用示例

命令 目的
pstree -p 显示所有进程及其 PID
pstree -a 显示所有进程的完整命令和参数
pstree -s 1234 显示 PID 为 1234 的进程及其所有父进程
`pstree -p grep ssh`

以上是 pstree 的核心用法和主要选项。它的输出直接来源于 /proc 文件系统,因此在某些受限环境下(如挂载了 hidepid 选项的 /proc),其显示的信息可能会受限。