2013-07-19 45 views
40

シェルスクリプトの親プロセスIDから子プロセスIDを取得することはできますか?親プロセスから子プロセスを取得する方法

シェルスクリプトを使用して実行するファイルがあります。これは、新しいプロセスプロセス1(親プロセス)につながります。このプロセス1は別のプロセスをforkしましたプロセス2(子プロセス)。スクリプトを使用して、私はコマンドを使用してプロセス1のpidを取得することができるよ:

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

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

+1

あなたはどの子プロセスとどの親プロセスを話していますか?定義上、シェルスクリプトはシェルプロセスによって実行されます!そしてなぜあなたは尋ねますか?あなたのスクリプトを表示してください! –

+0

私の質問に言い換えると – AlwaysALearner

+2

待つ...その 'cat'コマンドがあなたにPIDを与える方法は? –

答えて

84

ちょうど使用:それはLinuxのspecial parameter

あるので、

pgrep -P $your_process1_pid 
+1

現在のプロセスはシェルプロセスです! –

+0

pgrep -P \ 'pidofproc/path/to/your/process1 \' – Arwen

12

シェルプロセスが$$で、proc(5)ファイルシステムがプロセスに関する多くの情報を提供します。おそらく pgrep(1)(これは/procにアクセスしています)も役に立ちます。

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

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

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

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

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

Bash Guide(または間違いのあるadvanced bash scripting guideに注意してください)とadvanced linux programmingをお読みください。

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

+0

chat.freenode.netのgreybotの#bashから: ジャンクをフィルタリングする方法が分からない限り、悪名高い "高度な" Bashスクリプティングガイドは避けるべきです。スクリプトではなく、バグを書くように教えてくれるでしょう。その意味で、BashGuideは次のように書かれました:http://mywiki.wooledge.org/BashGuide; ちょうど私がそれを言いたいと思った! – Samadi

38

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

ps --ppid <pid of the parent> 
14

親プロセスのすべての子プロセスPIDを取得するためのscrpitを作成しました。 ここにコードがあります。役立ちますか? parent_pidから生成されたコマンドを印刷の各工程上

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

getcpid $1 
2
ps -axf | grep parent_pid 

、それが役に立てば幸い。 +++++++++++++++++++++++++++++++++++++++++++

[email protected]:~/chk_prgrm/lp# 

parent...18685 

child... 18686 


[email protected]:~/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 
-3
#include<stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() 
{ 
    // Create a child process  
    int pid = fork(); 

    if (pid > 0) 
    { 

      int j=getpid(); 

      printf("in parent process %d\n",j); 
    } 
    // Note that pid is 0 in child process 
    // and negative if fork() fails 
    else if (pid == 0) 
    { 





      int i=getppid(); 
      printf("Before sleep %d\n",i); 

      sleep(5); 
      int k=getppid(); 

      printf("in child process %d\n",k); 
    } 

    return 0; 

+0

このコードはinit()が孤児のプロセスをその子として取ります。 – user7329527

+0

これは答えではありません。それは疑問とは関係のない単なるコードブロックです。 – melpomene

関連する問題