Подтвердить что ты не робот

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

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

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

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

но я не могу извлечь pid дочернего процесса.

4b9b3361

Ответ 1

Просто используйте:

pgrep -P $your_process1_pid

Ответ 2

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

ps --ppid <pid of the parent>

Ответ 3

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

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

getcpid $1

Ответ 4

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

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

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

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

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

Затем используйте $parpid в script для ссылки на родительский процесс pid (родительский элемент оболочки).

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

Ознакомьтесь с некоторыми Bash Guide (или с осторожностью advanced bash руководство по сценариям, в котором есть ошибки) и расширенное программирование linux.

Обратите внимание, что некоторые процессы демона сервера (которые обычно должны быть уникальными) явно пишут pid в /var/run, например. дескриптор сервера sshd записывает свой pid в текстовый файл /var/run/sshd.pid). Вы можете добавить такую ​​функцию в свои собственные серверные программы (кодированные в C, С++, Ocaml, Go, Rust или какой-либо другой скомпилированный язык).

Ответ 5

ps -axf | grep parent_pid 

Выше команда печатает соответствующие процессы, созданные из parent_pid, надеюсь, что это поможет. +++++++++++++++++++++++++++++++++++++++++++

[email protected]:~/chk_prgrm/lp#

 parent...18685

 child... 18686


[email protected]:~/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

Ответ 6

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

Ответ 7

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

}