特定の子PIDから親PIDを取得する方法は?
/ procで手作業で確認できることは知っていますが、Ubuntuでこれを実現するスマートでより良い方法があるのではないかと思います。親が殺される場合とされない場合があります。
ありがとう
ps -o ppid=
を使用
ps -o ppid= 2072
は、2061
を返します。これは、スクリプトなどで簡単に使用できます。ps -o ppid= -C foo
は、コマンドfoo
でプロセスのPPIDを提供します。昔ながらのps | grep
:ps -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
を使用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)を取得します。
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]