web-dev-qa-db-ja.com

特定の子プロセスの親プロセスIDを取得するにはどうすればよいですか?

特定の子PIDから親PIDを取得する方法は?

/ procで手作業で確認できることは知っていますが、Ubuntuでこれを実現するスマートでより良い方法があるのではないかと思います。親が殺される場合とされない場合があります。

ありがとう

48
cache

コマンドラインを使用して、子のプロセスID(PID)から親PID(PPID)を取得する方法

ps -o ppid=を使用

  • 例えばps -o ppid= 2072は、2061を返します。これは、スクリプトなどで簡単に使用できます。ps -o ppid= -C fooは、コマンドfooでプロセスのPPIDを提供します。昔ながらのps | grepps -eo ppid,comm | grep '[f]oo'も使用できます。
  • 詳細な説明:ps -f 2072はを返します。
     UID PID PPID  C STIME TTY STAT TIME CMD 
     izx 2072 2061  0 07:16? S 0:00 /usr/lib/pulseaudio/Pulse/gconf-helper
    
  • pstree関係は、pstree -s -p 2072:です。
     init(1)───pulseaudio(2061)───gconf-helper(2072)
    
57
ish

Shell 変数のみを使用して、親PIDを取得します。

echo $PPID

この親pidからのコマンドが必要な場合:

cat /proc/$PPID/comm

完全なコマンドライン(すべてのオプションを含む)が必要な場合:

cat /proc/$PPID/cmdline

説明

  • $PPIDはシェルによって定義され、親プロセスのPIDです
  • /proc/には、各プロセスのPIDを持ついくつかのディレクトリがあります。次に、cat /proc/$PPID/commの場合、PIDのコマンド名をエコーし​​ます

チェック man proc

6
Gilles Quenot

コマンド名でpstreeを使用

pstreeを使用すると、子プロセス名で検索し、親、祖父母、および子プロセスのすべての子とともにプロセスID(PID)を取得できます。

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

この場合、sleepは子コマンドであり、そのPIDは8414です。親IDは841で、display-auto-brightnessと呼ばれます。祖父母は、プロセスIDが839のシェル(sh)です。 great祖父母はcronで、プロセスIDは795です。 great-great-grandparentもcronで、プロセスIDは763です。

名前の代わりにsleepのプロセスIDで検索する場合は、次を使用できます。

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

sleepプロセスIDが14653に変更されたことに注目してください。親(PID 841)は1分間スリープし、1秒間目を覚まし、新しいプロセスIDを取得する新しいsleepコマンドを開始します。これは、sleepの検索がプロセスIDによる検索よりも簡単なもう1つの理由です。

このコードは、 日の出と日の入りに基づいてディスプレイの明るさを自動的に調整する から取得され、この質問に適合しています。


ネストされたチェーンをブートプロセスに戻るまで表示するには、名前の代わりにPIDを使用します。

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

注:さらに1分が経過し、sleepコマンドが新しいPID(8541)を取得します。

1

ps -efjも同じ目的に使用できます。

例えば、

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
0