如何从父进程获取子进程

Alw*_*ner 64 linux shell process child-process

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

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

cat /path/of/file/to/be/executed
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ert 121

只需使用:

pgrep -P $your_process1_pid
Run Code Online (Sandbox Code Playgroud)


Ken*_*ent 55

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

ps --ppid <pid of the parent>
Run Code Online (Sandbox Code Playgroud)

  • 用"linux"标记的问题 (11认同)

Goo*_*ofy 21

I'v written a scrpit to get all child process pids of a parent process. Here is the code.Hope it helps.

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

getcpid $1
Run Code Online (Sandbox Code Playgroud)


Bas*_*tch 14

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

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

因此,尝试cat /proc/$$/status获取shell进程的状态.

因此,可以用例如检索其父进程id

  parpid=$(awk '/PPid:/{print $2}' /proc/$$/status)
Run Code Online (Sandbox Code Playgroud)

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

但我认为你不需要它!

阅读一些Bash指南(或谨慎的高级bash脚本指南,它有错误)和高级linux编程.

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


小智 6

ps -axf | grep parent_pid 
Run Code Online (Sandbox Code Playgroud)

上面的命令打印从中生成的各个过程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
Run Code Online (Sandbox Code Playgroud)


小智 5

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


y_1*_*159 5

您可以通过阅读条目获取pids给定父进程的所有子进程。<pid>/proc/<pid>/task/<tid>/children

此文件包含第一级子进程的 pid。对所有儿童 pid 递归执行此操作。

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