我可以显示 1 个程序的进程树吗?

我可以显示 1 个程序的进程树吗?

我需要显示某个程序下的所有进程。如果我这样做,top -p PID我只会得到一个程序。

我想输入top -p 381 extra_args以获得

  PID USER      PR  NI    VIRT    RES  %CPU  %MEM     TIME+ S COMMAND                                                                            
  381 root      20   0 8715.7m  12.5m   0.0   0.3   0:48.42 S  `- /usr/bin/program          
10034 root      20   0 8476.3m   2.3m   0.0   0.1   0:00.03 S      `- -/usr/bin/sh                                                            
10036 root      20   0 8488.3m   2.2m   0.0   0.1   0:00.01 S          `- /usr/bin/sh ./login.sh                                              
10037 root      20   0    3.9m   3.1m   0.0   0.1   0:00.54 S              `- /usr/bin/bash --login +h                                           
19995 root      20   0 8506.3m   2.4m   0.0   0.1   0:00.01 S      `- -/usr/bin/sh                                                            
19997 root      20   0 8512.3m   2.2m   0.0   0.1   0:00.01 S          `- /usr/bin/sh ./login.sh                                              
19998 root      20   0    3.9m   3.1m   0.0   0.1   0:00.89 S              `- /usr/bin/bash --login +h                                           
30644 root      20   0    2.8m   2.1m   0.0   0.1   0:00.03 S                  `- make -j8                                                       
30647 root      20   0    2.8m   2.0m   0.0   0.1   0:00.01 S                      `- make all-recursive                                         
30648 root      20   0    2.2m   1.4m   0.0   0.0   0:00.00 S                          `- /bin/sh -c fail=; \ if (target_option=k; case ${targe+ 
30661 root      20   0    2.8m   2.1m   0.0   0.1   0:00.06 S                              `- make all-am                                        
30671 root      20   0    2.4m   1.6m   0.0   0.0   0:00.04 S                                  `- /bin/sh ./libtool --silent --tag=CC --mode=co+ 
30808 root      20   0    3.9m   0.3m   0.0   0.0   0:00.00 S                                      `- gcc -DHAVE_CONFIG_H -I. -I.. -I./include + 
30816 root      20   0  132.3m 117.7m  98.7   3.1   0:43.18 R                                          `- /usr/libexec/gcc/aarch64-unknown-linu+ 
30675 root      20   0    2.4m   1.6m   0.0   0.0   0:00.04 S                                  `- /bin/sh ./libtool --silent --tag=CC --mode=co+ 
31230 root      20   0    3.9m   0.3m   0.0   0.0   0:00.00 S                                      `- gcc -DHAVE_CONFIG_H -I. -I.. -I./include + 
31231 root      20   0   88.3m  76.6m  99.4   2.0   0:20.08 R                                          `- /usr/libexec/gcc/aarch64-unknown-linu+ 
31074 root      20   0    2.4m   1.6m   0.0   0.0   0:00.05 S                                  `- /bin/sh ./libtool --silent --tag=CC --mode=co+ 
31274 root      20   0    3.9m   0.3m   0.0   0.0   0:00.00 S                                      `- gcc -DHAVE_CONFIG_H -I. -I.. -I./include  

而不是top -p 381给出

  PID USER      PR  NI    VIRT    RES  %CPU  %MEM     TIME+ S COMMAND                                                                            
  381 root      20   0 8715.7m  12.5m   0.0   0.3   0:48.42 S  `- /usr/bin/program  

这是我的主要用法

top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]

答案1

top可能不是适合工作的工具。

ps有点用,但是你需要知道树中的所有 pid,这会违背整个目的。

ps u -p 2307,2312,2334,9379 --ppid 2307,2312,2334,9379 --forest
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2307  0.0  0.0   2200   264 ?        Ss   Dec15   0:00 runsv eto-netnses
eto       2312  0.0  0.0   2748   420 ?        S    Dec15   0:00  \_ s6-svscan netnses
eto       2334  0.0  0.0   2756   416 ?        S    Dec15   0:00      \_ s6-supervise netns-nsholder-vpn-tunnel
eto       9379  0.0  0.0   2184   300 ?        Ss   Dec17   0:00          \_ netns-nsholder-daemon

最简单的方法是使用pstree,它可以为您绘制一棵树,但缺乏输出其他信息的能力:

: pstree -p 2307 -a -u                                           
runsv,2307 eto-netnses
  └─s6-svscan,2312,eto netnses
      └─s6-supervise,2334 netns-nsholder-vpn-tunnel
          └─pause,9379

如果您可以获得进程树的会话 ID,并且该树中的所有进程都在同一个会话中运行,您可以使用该 SID 作为ps --forest格式选择器,但在我的情况下,这会中断,因为ps在此不会跨越会话边界模式,这就是这里发生的情况(pause又名netns-nsholder-daemon这里缺少上面的列表,因为它在新的 SID 中运行):

: ps -p 2307 -o pid,sess
  PID  SESS
 2307  2307
: ps u -s 2307 --forest 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2307  0.0  0.0   2200   264 ?        Ss   Dec15   0:00 runsv eto-netnses
eto       2312  0.0  0.0   2748   420 ?        S    Dec15   0:00  \_ s6-svscan netnses
eto       2334  0.0  0.0   2756   416 ?        S    Dec15   0:00      \_ s6-supervise netns-nsholder-vpn-tunnel

在这一点上,我相信您可能会更好htop

答案2

没有简单或直接的方法。如果您确实想要 pid 和任何子 pid 的顶级刷新功能,您可以在命令行上使用 pgrep 之类的东西。

如果您感兴趣的 PID 是,1234那么此命令将起作用:

top -p 1234 -p `pgrep -P 1234 -d,`

查找pgrep具有父进程 1234 并使用逗号分隔符的所有进程。

对此有一些限制:

  • 它不会“重新扫描”,因此如果有新的子进程,则它们不会显示
  • 它不会找到一整棵树,只是找到所请求的子进程,因此子进程的子进程不会出现
  • 任何现有的顶级过滤器都在发挥作用,这可能是也可能不是您想要的。我不显示空闲进程(顶部的 i 命令),因此最初顶部什么也没显示。按我给他们看了。

答案3

监视进程树的另一种方法

假设我们有一个myProcess使用 ID调用的进程1234

watch -d -n 1 "pstree -a 1234"

或者

watch -d -n 1 "pstree -a `pgrep -f myProcess`"

这将在新窗口中向您显示进程树,每秒更新一次并突出显示每次更新之间的更改。

watch将运行直到被中断。 ( ctrl-c)

概要

pgrep -f <command>仅返回命令的进程 ID

pstree显示进程树。

  • -a显示命令行参数
  • (您可以根据需要更改 pstree 参数,请参阅 pstree 手册页。)

watch重复运行命令,显示其输出

  • -n <n>每n秒运行一次
  • -d突出显示连续更新之间的差异

相关内容