95

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

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

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

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

4

11 回答 11

170

只需使用:

pgrep -P $your_process1_pid
于 2013-07-19T10:30:43.043 回答
66

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

ps --ppid <pid of the parent>
于 2013-07-19T10:36:48.677 回答
23

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

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

getcpid $1
于 2014-03-20T08:05:36.397 回答
15

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)。您可能希望将此类功能添加到您自己的类似服务器的程序中(使用 C、C++、Ocaml、Go、Rust 或其他一些编译语言编写)。

于 2013-07-19T10:34:50.920 回答
15

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

于 2018-05-29T02:03:08.530 回答
9
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
于 2016-11-02T09:53:28.503 回答
7

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

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

欲了解更多信息,请访问https://lwn.net/Articles/475688/

于 2020-08-15T11:18:43.017 回答
2

您可以打印父进程调用的所有子进程的 PID:

pstree -p <PARENT_PID> | grep -oP '\(\K[^\)]+'

这会递归打印主进程及其子进程的 pid 列表

于 2021-09-13T20:07:21.653 回答
1

我使用以下内容来收集特定进程 PID 的父进程和子进程:

ps -p $PID --ppid $PID --forest | tail -n +2 | awk '{print$1}'

请注意,这不适用于查找子进程的子进程。

于 2022-01-20T21:01:11.587 回答
0

对于感兴趣的进程树有超过 2 级的情况(例如 Chromium 产生 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,...
于 2020-09-05T16:48:54.100 回答
-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;

}

于 2016-12-22T09:09:23.827 回答