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

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

特定のプログラムのすべてのプロセスを表示する必要があります。これにより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

答え2

簡単で直接的な方法はありません。 pidと子pidのトップレベルリフレッシュ機能が本当に必要な場合は、コマンドラインでpgrepなどを使用できます。

関心のあるPIDが次のコマンドの場合、1234次のコマンドが機能します。

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

pgrep親プロセス1234を持つすべてのプロセスを見つけて、カンマ区切り文字を使用します。

これにはいくつかの制限があります。

  • 「再検索」されないため、新しい子プロセスがある場合は表示されません。
  • ツリー全体が見つからず、要求された子プロセスのみが見つかるため、子の子は表示されません。
  • 既存の親フィルタはすべて機能し、これは必要なものでもそうでない場合もあります。アイドルプロセス(上部のiコマンド)は表示されないため、最初は上部に何も表示されません。表示するには、私を押してください。

答え3

プロセスツリーを監視する別の方法

myProcessIDで呼び出すプロセスがあるとしましょう。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連続更新間の違いを強調

関連情報