菜鸟科技网

pstree命令如何查看进程树结构?

pstree 命令简介

pstree (Process Tree) 是一个非常有用的 Linux/Unix 命令行工具,它的主要功能是以树状图的形式显示系统中正在运行的进程,这个树状结构非常直观,可以清晰地展示出进程之间的父子关系。

pstree命令如何查看进程树结构?-图1
(图片来源网络,侵删)

当你想快速了解系统上有哪些主要的服务(进程),以及它们是如何相互关联的时,pstree 是一个绝佳的选择,它比单独使用 ps 命令更能让你把握整个进程体系的概览。


安装 pstree

在大多数现代 Linux 发行版中,pstree 通常是 ps 包的一部分,所以它通常已经预装了,如果没有,你可以使用以下命令进行安装:

  • 在基于 Debian/Ubuntu 的系统上:

    sudo apt-get install psmisc
  • 在基于 RedHat/CentOS/Fedora 的系统上:

    pstree命令如何查看进程树结构?-图2
    (图片来源网络,侵删)
    sudo yum install psmisc
    # 或者对于 dnf
    sudo dnf install psmisc

psmisc 包还包含了 pstree, killall, fuser 等实用工具。


基本语法

pstree [选项] [PID|USER|args]
  • 选项: 用于控制输出的格式和内容。
  • PID|USER|args (可选): 可以指定一个进程ID、用户名或命令行参数来限制显示的进程范围。

常用选项及示例

下面我们通过一些常见的选项来了解 pstree 的强大功能。

示例环境

为了演示,我们会在一个终端运行 sleep 1000 命令,并记住它的 PID(12345),然后在另一个终端使用 pstree

默认显示

不带任何选项直接运行 pstree,它会以树状结构显示所有进程,通常将 initsystemd 作为根进程。

pstree命令如何查看进程树结构?-图3
(图片来源网络,侵删)
pstree

输出可能类似于这样(具体取决于你的系统):

systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─acpid
        ├─atd
        ├─auditd───{auditd}
        ├─colord───2*[{colord}]
        ├─crond
        ├─dbus-da───{dbus}
        ├─firewalld───{firewalld}
        ├─...
        ├─sshd───sshd───bash───sleep 1000  <-- 我们新创建的进程
        ├─systemd───(sd-pam)
        ├─systemd-logind
        ├─...
        └──2*[systemd]

从上面的输出中,你可以看到 sshd -> bash -> sleep 1000 这条清晰的父子链。

-p--show-pids:显示进程ID

这是最常用的选项之一,因为它在树状结构旁边显示每个进程的 PID,方便你进行精确操作。

pstree -p

输出会包含 PID:

systemd(1)─┬─ModemManager(852)───{ModemManager}(853)
           ├─NetworkManager(855)───{NetworkManager}(856)
           ├─accounts-daemon(860)───{accounts-daemon}(861)
           ├─sshd(1234)───sshd(5678)───bash(9012)───sleep(12345) <-- PID 被显示出来了
           └─...

-u--show-user:显示进程所属用户

这个选项会显示每个进程的运行用户,对于排查权限问题非常有帮助。

pstree -u

输出会包含用户名:

systemd(root)─┬─ModemManager(root)───{ModemManager}(root)
              ├─NetworkManager(root)───{NetworkManager}(root)
              ├─accounts-daemon(root)───{accounts-daemon}(root)
              ├─sshd(root)───sshd(myuser)───bash(myuser)───sleep(myuser) <-- 用户被显示出来了
              └─...

-a--arguments:显示进程的完整命令行参数

默认情况下,pstree 只显示进程名,使用此选项可以看到进程启动时使用的完整参数。

pstree -a

输出会显示命令行:

systemd --switched-root --system --deserialize 22
  └─sshd -D
      └─sshd -p 22
          └─bash -c sleep 1000
              └─sleep 1000  <-- 完整的命令行被显示出来了

-h--highlight-current:高亮显示当前进程

当你使用 pstree 查看特定进程树时,这个选项会用不同的颜色或高亮方式标出当前正在运行的进程(也就是 pstree 命令本身所在的进程树)。

# 首先找到你的 bash PID
echo $$
# 假设输出是 9012
# 然后用该 PID 查看 pstree
pstree -h 9012

你的 bash 进程及其所有父进程和子进程会被高亮显示。

-g--ascii:使用 ASCII 字符而不是连线和符号

在某些终端或复制文本时,默认的 UTF-8 连线可能会出现问题,使用 -g 可以改用经典的 ASCII 字符(如 , , , \) 来绘制树状图。

pstree -g

-t--thread:显示线程

在现代 Linux 系统中,很多进程是多线程的,此选项会深入到进程的内部,显示其线程,线程通常显示为进程名加方括号 []

pstree -t

对于多线程的进程(如 javanginx),你会看到类似 java───[java] 的输出。

-C--color:控制颜色输出

可以指定颜色来区分不同类型的进程。

  • always: 总是使用颜色。
  • never: 从不使用颜色。
  • auto (默认): 如果输出到终端则使用颜色。
# 总是使用颜色
pstree -C always
# 不使用颜色
pstree -C never

限制显示范围

你可以将 pstree 的输出范围限定为某个特定进程、特定用户或特定命令。

# 只显示与用户 'myuser' 相关的进程树
pstree myuser
# 只显示 PID 为 12345 的进程及其子进程
pstree 12345
# 只包含名称中带有 'sshd' 的进程树
pstree sshd

实际应用场景

  1. 系统诊断:当系统变慢或无响应时,使用 pstree 可以快速定位是否有异常的进程树(某个进程 fork 了大量的子进程)。
  2. 理解服务依赖:你可以看到 nginx 进程是由 systemd 启动的,而 systemd 又是由内核启动的,这有助于你理解系统的启动和服务管理机制。
  3. 查找僵尸进程:虽然 pstree 不会直接标记僵尸进程(Z状态),但如果一个进程下有大量名为 defunct 的子进程,那通常意味着存在僵尸进程,需要进一步用 ps 命令排查。
  4. 配合 killpkill 使用:看到 pstree 的输出后,你可以更精确地决定要终止哪个进程,如果你想干掉整个 sleep 1000 及其父进程 bash,你可以使用 kill -9 9012bash 的 PID)。

选项 全称 描述
-p --show-pids 显示每个进程的 ID。
-u --show-user 显示每个进程的属主。
-a --arguments 显示进程的完整命令行参数。
-h --highlight-current 高亮显示当前进程。
-g --ascii 使用 ASCII 字符绘制树状图。
-t --thread 显示线程。
-C --color 控制颜色输出。
-s --show-parents 显示指定进程的直接父进程。
-n --numeric-sort 按 PID 排序,而不是按名称。
-U --unicode 使用扩展的 Unicode 字符绘制(默认)。

pstree 虽然简单,但它是系统管理员和开发者在日常工作中排查问题、理解系统运行状态的一把“瑞士军刀”,熟练掌握它能让你对 Linux 系统的进程管理有更深刻的理解。

分享:
扫描分享到社交APP
上一篇
下一篇