シェルスクリプトで親プロセスIDから子プロセスIDを取得することは可能ですか?
新しいプロセスprocess1 (親プロセス)につながるシェル スクリプトを使用して実行するファイルがあります。このprocess1は、別のプロセスprocess2 (子プロセス) を fork しました。スクリプトを使用すると、次のコマンドを使用してprocess1の pid を取得できます。
cat /path/of/file/to/be/executed
しかし、子プロセスのpidを取得できません。
シェルスクリプトで親プロセスIDから子プロセスIDを取得することは可能ですか?
新しいプロセスprocess1 (親プロセス)につながるシェル スクリプトを使用して実行するファイルがあります。このprocess1は、別のプロセスprocess2 (子プロセス) を fork しました。スクリプトを使用すると、次のコマンドを使用してprocess1の pid を取得できます。
cat /path/of/file/to/be/executed
しかし、子プロセスのpidを取得できません。
使用するだけです:
pgrep -P $your_process1_pid
親プロセスのすべての子プロセス pid を取得するスクリプトを作成しました。これがコードです。それが役立つことを願っています。
function getcpid() {
cpids=`pgrep -P $1|xargs`
# echo "cpids=$cpids"
for cpid in $cpids;
do
echo "$cpid"
getcpid $cpid
done
}
getcpid $1
シェルプロセスは特別なパラメータな$$ので
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、またはその他のコンパイル済み言語でコーディングされたもの) に追加したい場合があります。
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
#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;
}