web-dev-qa-db-ja.com

プロセスの子を見つける

特定のプロセスの子供を知る方法はありますか?たとえば、親IDがfooである子?

14

pstree コマンドを探しています。 pstree自体は、すべてのプロセスをツリー形式でリストします(lsblkのように)。 -pフラグを使用してPIDを一覧表示することも、-sを使用して親プロセスを表示することもできます。

$ pstree -p 602
udisksd(602)-+-{cleanup}(607)
             |-{gdbus}(605)
             |-{gmain}(603)
             `-{probing-thread}(606)

(おそらく)POSIX準拠の子PIDを取得する方法(他のコメントで言及した):

ps -o ppid= -o pid= -A | awk '$1 == <some pid>{print $2}'

これは ps にすべてのプロセスの親PIDおよびPID(見出しなし)を書き込むように指示し、次に awk を使用して最初のフィールドに特定のPIDがある行を確認します(親PID)、および対応する2番目のフィールド(子PID)を出力します。

25
muru

PIDが123であるプロセスの直接の子を表示する場合は、psコマンドの--ppidオプションを使用できます。

ps --ppid 123

これをpidofコマンドと組み合わせて、名前でプロセスの子を取得できます。つまり、fooというプロセスを指定できます

ps --ppid $(pidof foo)
10
steeldriver

別のオプションは、System Monitor(プリインストール済み)を使用することです。 SMメニューバーで、[表示]の下の[依存関係]オプションをマークして、視覚的なフィードバックを表示し、下のスクリーンショットに示すような親および子プロセスを表示します。

私は自分でCL(コマンドライン)を好み、Linux(この場合はUbuntu)を日常的に使用している人は、GUIアプリケーションよりも基本的なコマンドの学習に賢明に時間を費やすか、少なくとも両方を習得できることをお勧めしますある程度!

enter image description hereenter image description here

10
v2r

私は専門家ではありませんが、上記の回答を読むと、おそらくprocファイルシステムを介してこれを行うより直接的な方法があると思われました。人間が読み取れる表示ではなく、スクリプトでプログラムで使用するため。実際、IDコードが$ mypidのプロセスの場合、その子プロセスは

/proc/$mypid/task/$mypid/children

例えば.

$ cat /proc/3123/task/3123/children 
3131 3133

同様に、ファイルの「PPid」エントリを介して親プロセスIDを取得できます

/proc/$mypid/task/$mypid/status

例えば.

$ grep PPid /proc/3131/task/3131/status
PPid:   3123
$ grep PPid /proc/3131/task/3131/status | cut -f2
3123

ただし、これがLinuxシステムを超える移植性があるかどうかはわかりません。

6
andybuckley