Как получить дочерний процесс от родительского процесса

можно ли получить идентификатор дочернего процесса из идентификатора родительского процесса в сценарии оболочки?

У меня есть файл для выполнения с помощью сценария оболочки, который приводит к новому процессу process1 (родительский процесс). Это process1 раздвоился другой процесс process2(дочерний процесс). Используя скрипт, я могу получить pid process1 С помощью команды:

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

но я не могу получить pid ребенка процесс.

7 ответов


просто использовать :

pgrep -P $your_process1_pid

Я не уверен, правильно ли я вас понимаю, помогает ли это?

ps --ppid <pid of the parent>

Я написал scrpit, чтобы получить все дочерние pids процесса родительского процесса. Вот код.Надеюсь, это поможет.

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

getcpid 

процесс оболочки $$ так как специальный параметр

в Linux proc (5) файловая система дает много информации о процессах. Возможно pgrep(1)/proc) могут тоже помочь.

так попробуй cat /proc/$$/status чтобы получить статус процесса оболочки.

следовательно, его Родительский идентификатор процесса может быть получен, например,

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

затем использовать $parpid в вашем скрипте обратитесь к родительскому процессу pid (родительский процесс оболочки).

но я не думаю, что вам это нужно!

читать некоторые Bash Guide (или с осторожностью расширенный bash руководство сценариев, который имеет ошибки) и расширенное Программирование linux.

обратите внимание, что некоторые серверные демонические процессы (которые обычно должны быть уникальными) явно записывают свой pid в /var/run, например,sshd демон сервера записывает свой PID в текстовый файл /var/run/sshd.pid). Вы можете добавить такую функцию в свои собственные серверные программы (закодированные на 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

получить дочерний процесс и поток, pstree -p PID. Он также показывает иерархическое дерево


#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;

}