如何从父进程获取subprocess

是否有可能从shell脚本中的父进程ID获取subprocessID?

我有一个使用shell脚本执行的文件,这导致了一个新的进程process1 (父进程)。 该进程1已经分叉了另一个进程进程2 (subprocess)。 使用脚本,我可以使用以下命令获得process1的pid:

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

但我无法获取subprocess的PID。

只要使用:

 pgrep -P $your_process1_pid 

我不知道我是否正确理解你,这有帮助吗?

 ps --ppid <pid of the parent> 

我写了一个scrpit来获取父进程的所有subprocesspid。 这是code.Hope它有帮助。

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

shell进程是$$因为它是一个特殊的参数

在Linux上, proc(5)文件系统提供了很多关于进程的信息。 也许pgrep(1) (访问/proc )也可能有帮助。

所以试试cat /proc/$$/status来获得shell进程的状态。

因此,它的父进程ID可以用例如

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

然后在脚本中使用$parpid来引用父进程的pid(shell的父进程)。

但我不认为你需要它!

阅读一些Bash指南 (或小心先进的Bash脚本指南 ,其中有错误)和先进的Linux编程 。

请注意,某些服务器守护进程(通常必须是唯一的)明确将其pid写入/var/run ,例如, sshd服务器守护进程将其pid写入文本文件/var/run/sshd.pid )。 您可能希望将这样的function添加到您自己的类似服务器的程序中(用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; 

}