プログラムのプロセスツリーを表示できますか?

プログラムのプロセスツリーを表示できますか?

特定のプログラムのすべてのプロセスを表示する必要があります。これにより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-daemonSIDで実行されているため、上記のリストがありません)。

: 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

おすすめ記事