如何从父进程获取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;
}