如何从父进程获取子进程

时间:2013-07-19 10:27:28

标签: linux shell process child-process

是否可以从shell脚本中的父进程id获取子进程ID?

我有一个使用shell脚本执行的文件,这会导致一个新进程 process1 (父进程)。此进程1 已分叉另一个进程 process2 (子进程)。使用脚本,我可以使用以下命令获取 process1 的pid:

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

但是我无法获取子进程的pid。

9 个答案:

答案 0 :(得分:110)

只需使用:

pgrep -P $your_process1_pid

答案 1 :(得分:49)

我不确定我是否理解正确,这有帮助吗?

ps --ppid <pid of the parent>

答案 2 :(得分:19)

我编写了一个脚本来获取父进程的所有子进程pid。 这是代码。希望它有所帮助。

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

getcpid $1

答案 3 :(得分:13)

shell进程为$$,因为它是special parameter

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

请尝试使用cat /proc/$$/status来获取shell进程的状态。

因此,可以使用例如

来检索其父进程ID
  parpid=$(awk '/PPid:/{print $2}' /proc/$$/status)

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

但我认为你不需要它!

阅读一些Bash Guide(或谨慎advanced bash scripting guide,其中有错误)和advanced linux programming

请注意,某些服务器守护程序进程(通常需要是唯一的)明确地将其pid写入/var/run,例如: sshd服务器守护程序正在将其pid写入文本文件/var/run/sshd.pid)。您可能希望将这样的功能添加到您自己的类似服务器的程序中(用C,C ++,Ocaml,Go,Rust或其他一些编译的语言编写)。

答案 4 :(得分:4)

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

答案 5 :(得分:3)

您可以通过读取pids项来获取给定父进程<pid>的所有子进程中的/proc/<pid>/task/<tid>/children

此文件包含一级子进程的pid。

有关更多信息,请访问https://lwn.net/Articles/475688/

答案 6 :(得分:2)

要获取子进程和线程, pstree -p PID。 它还显示了分层树

答案 7 :(得分:0)

对于感兴趣的过程树具有2个以上级别的情况(例如,铬生成4级深度的过程树),pgrep没什么用。正如上面其他人提到的, procfs 文件包含有关进程的所有信息,只需要读取它们即可。我构建了一个名为Procpath的CLI工具,正是这样做的。它读取所有/proc/N/stat文件,将内容表示为JSON树并将其公开给JSONPath查询。

要获取非根进程的所有子进程的逗号分隔的PID(对于根,其..stat.pid)为:

$ procpath query -d, "..children[?(@.stat.pid == 24243)]..pid"
24243,24259,24284,24289,24260,24262,24333,24337,24439,24570,24592,24606,...

答案 8 :(得分:-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;

}