95

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

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

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

しかし、子プロセスのpidを取得できません。

4

11 に答える 11

170

使用するだけです:

pgrep -P $your_process1_pid
于 2013-07-19T10:30:43.043 に答える
23

親プロセスのすべての子プロセス pid を取得するスクリプトを作成しました。これがコードです。それが役立つことを願っています。

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

getcpid $1
于 2014-03-20T08:05:36.397 に答える
15

シェルプロセスは特別なパラメータな$$ので

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、またはその他のコンパイル済み言語でコーディングされたもの) に追加したい場合があります。

于 2013-07-19T10:34:50.920 に答える
9
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
于 2016-11-02T09:53:28.503 に答える
-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;

}

于 2016-12-22T09:09:23.827 に答える