Як отримати дочірній процес з батьківського процесу


77

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

У мене є файл для виконання за допомогою сценарію оболонки, що веде до нового процесу process1 (батьківського процесу). Це process1 має роздвоєний інший процес Process2 (дочірній процес). Використовуючи скрипт, я можу отримати pid of process1 за допомогою команди:

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

але я не можу отримати pid процесу дитини.


1
Про яку дитину та про який батьківський процес Ви говорите? За визначенням, сценарій оболонки виконується процесом оболонки! А чому ти питаєш? Покажіть свій сценарій, будь ласка!
Василь Старинкевич

3
Зачекайте ... як ця catкоманда дає вам PID?
Miklos Aubert

2
Справді здається, що ви дуже розгублені!
Василь Старинкевич

1
Я зазначаю @BasileStarynkevitch: покажіть, будь ласка, свій сценарій або принаймні відповідну частину.
Miklos Aubert

2
@ y_159. Використовуйте Strace (1) у програмах, подібних до вашої (наприклад, на psor top), щоб дізнатись, про які залучені системні дзвінки (2) , або черпайте натхнення з існуючих проектів, подібних до вашого, на github або gitlab
Basile

Відповіді:



58

Я не впевнений, що я вас правильно розумію, чи допомагає це?

ps --ppid <pid of the parent>

13
питання з позначкою "linux"
Кент

22

Я написав сценарій, щоб отримати всі дочірні ідентифікатори процесу батьківського процесу. Ось код. Сподіваюся, це допоможе.

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

getcpid $1

15

Процес оболонки полягає в $$тому, що це особливий параметр

У Linux файлова система proc (5) надає багато інформації про процеси. Можливо, pgrep (1) (який доступ /proc) також може допомогти.

Тож спробуйте cat /proc/$$/statusотримати статус процесу оболонки.

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

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

Потім використовуйте $parpid у своєму сценарії посилання на батьківський процес pid (батьківський елемент оболонки).

Але я не думаю, що це вам потрібно!

Прочитайте посібник із Bash (або з обережністю розширений посібник із сценаріїв bash , який містить помилки) та вдосконалене програмування Linux .

Зверніть увагу, що деякі процеси демона сервера (які, як правило, повинні бути унікальними) явно записують свій pid /var/run, наприклад,   sshdдемон сервера записує свій pid у текстовий файл /var/run/sshd.pid). Можливо, ви захочете додати таку функцію у свої власні серверні програми (закодовані на C, C ++, Ocaml, Go, Rust або іншій компільованій мові).


З #bash на greybot chat.freenode.net: Слід уникати сумнозвісного "Розширеного" посібника для сценаріїв Bash, якщо ви не знаєте, як відфільтрувати сміття. Це навчить вас писати помилки, а не сценарії. У цьому світлі було написано BashGuide : mywiki.wooledge.org/BashGuide ; Просто подумав, що згадаю про це!
vktec

11

Щоб отримати дочірній процес і нитка, pstree -p PID. Він також показує ієрархічне дерево


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

3

Ви можете отримати pidsвсі дочірні процеси даного батьківського процесу <pid>, прочитавши /proc/<pid>/task/<tid>/childrenзапис.

Цей файл містить pids дочірніх процесів першого рівня.

Для отримання додаткової інформації перейдіть за посиланням https://lwn.net/Articles/475688/


рекурсивно робити це для <дітей pids>
y_159

0

У випадку, коли дерево процесів, що представляє інтерес, має більше 2 рівнів (наприклад, Chromium породжує 4-рівневе дерево процесів), pgrepце не надто корисно. Як вже згадували інші, файли procfs містять всю інформацію про процеси, і їх просто потрібно прочитати. Я створив інструмент CLI під назвою Procpath, який робить саме це. Це читає все/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,...

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

}


цей код допомагає вам, щоб init ()
приймав
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.