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


49

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

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

ありがとう

回答:


58

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

つかいます ps -o ppid=

  • 例えばps -o ppid= 2072戻り2061、あなたが簡単にスクリプトなどで使用することができ、ps -o ppid= -C fooコマンドでプロセスのPPIDを与えますfoo。昔ながらのものも使用できます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)
    

行を分割せずにpstreeに呼び出し(コマンド+引数)を表示させる方法を知っていますか?結果が1行に簡単に収まる場合でも、引数を追加すると、インストールによって行が自動的に分割されます。マニュアルページにも同じように書かれているように見えますが、理由はありません。私の回避策は、pstreeからPIDを抽出ps -o args ...し、結果を使用することですが、それは少し臭いがあります。
ジョンP

私を驚かせたもの:ppid= pidの後、しかし前のスペースが必要なようです。省略した場合、異なる結果が得られました。
グレゴリーアレニウス

8

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

echo $PPID

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

cat /proc/$PPID/comm

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

cat /proc/$PPID/cmdline

説明

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

man procを確認してください


1
これが最良の答えです。procfsはカーネルAPIです。コマンドを実行し、出力を解析するのはナンセンスです。
マッシモ

これは、潜在的に最も移植性が高くPPID、POSIX標準の一部として定義されているため、POSIX準拠のシェルはこれを適切に設定する必要があります。pubs.opengroup.org/onlinepubs/9699919799/utilities/…を
RobV

2

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ます。祖父母は、shプロセスID がのshell()です839。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秒間目を覚ましてから、新しいsleepコマンドを開始して新しいプロセスIDを取得します。これは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)を取得します。


あなたの例では、このメソッドはPID 807のcronプロセスでは機能しませんでした
。– Olorin

@Olorinどちらの例でも、807またはcronでgrepを実行すると、同じ行が再生成され、スポーンされた場合はさらに多くの子が生成されます。しかし、問題はすべての子供ではなく、親を見つけることでした。
WinEunuuchs2Unix

正確に-その出力でPID 807の親をどのように見つけますか?それは807の親が含まれていませんbecvauseあなたは、することはできません
Olorin

@Olorin cronの親はsystemdで、PID 1です。PID 1を殺すことができるとは思わない。
WinEunuuchs2Unix18年

殺すことについては何も言わなかった。明確にするために、pstreeの最初の行を取得するか、コマンド名をgrepすることで、常に親PIDが得られると主張していますか?
オロリン

0

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]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.