您的位置:

使用ptree快速查看进程树结构

一、ptree概述

ptree是一款Linux系统查看进程树的常用命令,它可以输出当前系统进程以及它们的父子关系。

在Linux系统中,进程树结构决定了进程之间的关系,其中每个进程都有一个父进程和若干个子进程。通过查看进程树,可以清晰地了解每个进程的相关信息,便于运维工程师更好地管理进程。

二、使用ptree命令查看进程树结构

在Linux系统中使用ptree命令可以快速查看进程树结构。

$ ptree

执行上述命令后,会输出当前系统中所有进程的父子关系,如下图所示:

systemd(1)-+-NetworkManager(1014)-+-{NetworkManager}(1076)
           |                     |-{NetworkManager}(1077)
           |                     |-{NetworkManager}(1078)
           |                     |-{NetworkManager}(1079)
           |                     |-{NetworkManager}(1080)
           |                     `-4*[{NetworkManager}(1014)]
           |-accounts-daemon(1017)-+-{accounts-daemon}(1048)
           |                      `-{accounts-daemon}(1049)
           |-acpid(1010)
           |-agetty(2072)
           |-agetty(2073)
           |-cron(704)
           |-2*[dbus-daemon(1007)]
           |-dbus-daemon(1057)
           |-dbus-launch(1006)
           .....省略

可以看到,每行输出都代表一个进程,以进程名和进程ID(PID)开头。每个进程后面跟随一个符号,代表进程的运行状态。如果进程是可中断的,符号前面会有一个S(sleep)或T(stop)字母。如果进程是正在运行的,符号前面为R(run)。如果进程是僵尸进程,符号前面为Z(zombie)。除此之外,有些进程还会有字母D(uninterruptible sleep)。

三、使用ptree命令查看指定进程树结构

有时候我们只想查看某一个特定进程及其子进程,可以使用ptree命令指定进程PID,具体命令如下:

$ ptree [pid]

例如,我们可以用ptree命令查看进程PID为1014的网络管理器及其子进程:

$ ptree 1014

输出结果如下:

systemd(1)-+-NetworkManager(1014)-+-{NetworkManager}(1076)
           |                     |-{NetworkManager}(1077)
           |                     |-{NetworkManager}(1078)
           |                     |-{NetworkManager}(1079)
           |                     |-{NetworkManager}(1080)
           |                     `-4*[{NetworkManager}(1014)]

可以看到,只有进程号为1014的NetworkManager及其子进程输出了,其它进程被省略。

四、使用ptree命令显示进程树结构图

如果想要更直观地查看进程树结构,可以使用ptree命令加上-n选项,输出进程树的结构图。具体命令如下:

$ ptree -n

执行上述命令后,会输出当前系统中所有进程的父子关系,以树状结构显示,如下图所示:

systemd(1)---NetworkManager(1014)---{NetworkManager}(1076)
            |                        |-{NetworkManager}(1077)
            |                        |-{NetworkManager}(1078)
            |                        |-{NetworkManager}(1079)
            |                        |-{NetworkManager}(1080)
            |                        `-{NetworkManager}(1014)
            |-accounts-daemon(1017)---{accounts-daemon}(1048)
            |                        `-{accounts-daemon}(1049)
            |-acpid(1010)
            |-agetty(2072)
            |-agetty(2073)
            |-cron(704)
            |-dbus-daemon(1007)---{dbus-daemon}(1038)
            |                    `-{dbus-daemon}(1057)
            |-dbus-launch(1006)---{dbus-launch}(1023)
            |-dnsmasq(1046,br-lan)
            |-exim4(1050)
            |-gdm3(1099)-+-gdm-session-wor(1335)---ssh-agent(1375)
            |             |-{gdm-session-wor}(1336)
            |             |-{gdm-session-wor}(1337)
            |             |-{gdm-session-wor}(1341)
            |             |-{gdm-session-wor}(1343)
            |             |-{gdm-session-wor}(1350)
            |             |-{gdm-session-wor}(1351)
            |             |-{gdm-session-wor}(1364)
            |             `-{gdm-session-wor}(1365)
            |-git(3642)---bash(3659)---ptree(4335)
            |-git(4352)---bash(4369)---ptree(4382)
            |-irqbalance(1013)...

通过这种方式显示进程树结构,可以更加直观地了解进程之间的父子关系以及运行状态。

五、使用ps和grep命令结合查看进程树结构

除了ptree命令之外,我们还可以使用ps和grep命令结合查看进程树结构。具体命令如下:

$ ps -ef | grep [pid]

其中,pid为进程PID。例如,我们可以用ps和grep命令查看进程PID为1014的网络管理器及其子进程:

$ ps -ef | grep 1014

输出结果如下:

root     1014     1  0  2020 ?        00:00:34 /usr/sbin/NetworkManager --no-daemon
root     1076  1014  0  2020 ?        00:00:00  \_ /sbin/dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /run/dhclient-enp0s3.pid -lf /var/lib/NetworkManager/dhclient-82bd1d0a-fc92-3bf0-a5df-64d98b58222f-enp0s3.lease -cf /var/lib/NetworkManager/dhclient-enp0s3.conf enp0s3
root     1077  1014  0  2020 ?        00:00:00  \_ /sbin/dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /run/dhclient-wlp4s0.pid -lf /var/lib/NetworkManager/dhclient-967a4d97-2314-3c3e-a867-4e8c7cffa32e-wlp4s0.lease -cf /var/lib/NetworkManager/dhclient-wlp4s0.conf wlp4s0
root     1078  1014  0  2020 ?        00:00:02  \_ /sbin/wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlp4s0 -Dnl80211,wext
root     1079  1014  0  2020 ?        00:02:24  \_ /usr/lib/policykit-1/polkitd --no-debug
root     1080  1014  0  2020 ?        00:00:00  \_ /usr/bin/at-spi-bus-launcher --launch-immediately
root      633  1229  0  2020 pts/5    00:00:00 grep --color=auto 1014

通过这种方式查看进程树结构,可以输出进程的详细信息。

六、总结

ptree命令是Linux系统中快速查看进程树结构的常用命令,通过查看进程树结构可以直观地了解进程之间的父子关系以及运行状态,方便运维工程师进行进程管理。除了ptree命令之外,我们还可以使用ps和grep命令结合查看进程树结构。