web-dev-qa-db-ja.com

親プロセスから子プロセスを取得する方法

シェルスクリプトで親プロセスIDから子プロセスIDを取得することは可能ですか?

シェルスクリプトを使用して実行するファイルがあるため、新しいプロセスprocess1(親プロセス)につながります。このprocess1は別のプロセスを分岐しましたprocess2(child process)。スクリプトを使用して、次のコマンドを使用してprocess1のpidを取得できます。

cat /path/of/file/to/be/executed

しかし、私は子プロセスのpidを取得することはできません。

62
AlwaysALearner

ただ使用する:

pgrep -P $your_process1_pid
114
Miklos Aubert

あなたを正しく理解しているかどうかわかりませんが、これは役に立ちますか?

ps --ppid <pid of the parent>
53
Kent

親プロセスのすべての子プロセスPIDを取得するスクリプトを作成しました。コードは次のとおりです。

function getcpid() {
    cpids=`pgrep -P $1|xargs`
#    echo "cpids=$cpids"
    for cpid in $cpids;
    do
        echo "$cpid"
        getcpid $cpid
    done
}

getcpid $1
20
Goofy

特殊パラメーター であるため、シェルプロセスは$$です。

Linuxでは、 proc(5) ファイルシステムはプロセスに関する多くの情報を提供します。おそらく pgrep(1)/procにアクセスする)も役立つかもしれません。

cat /proc/$$/statusを試して、シェルプロセスのステータスを取得してください。

したがって、その親プロセスIDは、たとえば.

  parpid=$(awk '/PPid:/{print $2}' /proc/$$/status)

次に、スクリプトで$parpidを使用して、親プロセスpid(シェルの親)を参照します。

しかし、私はあなたがそれを必要とは思わない!

いくつかの Bashガイド (または注意して 高度なbashスクリプトガイド 、これには間違いがあります)および 高度なLinuxプログラミング を読んでください。

一部のサーバーデーモンプロセス(通常は一意である必要があります)が明示的にpidを/var/runに書き込んでいることに注意してください。 sshdサーバーデーモンは、そのpidをテキストファイル/var/run/sshd.pid)に書き込みます。このような機能を独自のサーバーライクなプログラム(C、C++、Ocaml、Go、Rustまたはその他のでコーディングされた)に追加することもできます言語)。

14

子プロセスとスレッドを取得するには、pstree -p PID。階層ツリーも表示されます

5
where23
ps -axf | grep parent_pid 

上記のコマンドは、parent_pidから生成された各プロセスを出力します。 +++++++++++++++++++++++++++++++++++++++++++++

root@root:~/chk_prgrm/lp#

 parent...18685

 child... 18686


root@root:~/chk_prgrm/lp# ps axf | grep frk

 18685 pts/45   R      0:11  |       \_ ./frk

 18686 pts/45   R      0:11  |       |   \_ ./frk

 18688 pts/45   S+     0:00  |       \_ grep frk
4
krishna