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

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

Я знаю, что могу вручную проверить его в / proc, мне интересно, есть ли умный / лучший способ добиться этого в Ubuntu. Обратите внимание, что родитель может или не может быть убит.

Благодаря

50
задан 21 June 2012 в 10:28

4 ответа

Использование только переменной для получения родительского PID:

echo $PPID

, если вам нужна команда из этого родительского pid:

cat /proc/$PPID/comm

, если вам нужна полная командная строка (со всеми параметрами):

cat /proc/$PPID/cmdline

Пояснение

  • $PPID определяется оболочкой, это PID родительского процесса
  • в /proc/ у вас есть несколько папок с PID каждого процесса. Затем, если вы cat /proc/$PPID/comm, вы выводите имя команды PID

Проверьте man proc

0
ответ дан 21 June 2012 в 10:28

Как получить родительский PID (PPID) из ID дочернего процесса (PID) с помощью командной строки

Использовать ps -o ppid=

  • , например ps -o ppid= 2072 возвращает 2061, который вы можете легко использовать в скрипте и т. Д. ps -o ppid= -C foo дает PPID процесса с помощью команды foo. Вы также можете использовать старомодный ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Более полное объяснение: ps -f 2072 возвращает
    UID        PID  PPID  C STIME TTY      STAT   TIME CMD
    izx       2072  2061  0 07:16 ?        S      0:00 /usr/lib/pulseaudio/pulse/gconf-helper
    
  • Отношение pstree: pstree -s -p 2072:
    init(1)───pulseaudio(2061)───gconf-helper(2072)
    
0
ответ дан 21 June 2012 в 10:28

Используя pstree по имени команды

Используя pstree, вы можете осуществлять поиск по имени дочернего процесса и получать идентификатор процесса (PID) вместе с родителями, бабушкой и дедушкой и любыми дочерними элементами дочернего процесса:

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

В этом случае sleep является дочерней командой, а ее PID равен 8414. Его родительский ID 841 и называется display-auto-brightness. Дедушка - это оболочка (sh) с идентификатором процесса 839. Прадедушка - cron с идентификатором процесса 795. Пра-пра-прародитель также имеет cron с идентификатором процесса 763.

Если вы хотите выполнить поиск по идентификатору процесса sleep вместо имени, вы можете использовать:

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

Обратите внимание, что идентификатор процесса sleep изменен на 14653. Родитель (PID 841) спит в течение 1 минуты, просыпается на долю секунды и затем запускает новую команду sleep, которая получает новый идентификатор процесса. Это еще одна причина, по которой поиск sleep проще, чем поиск по идентификатору процесса.

Этот код был взят из: Автоматически настраивает яркость дисплея на основе восхода и захода солнца и адаптирован к этому вопросу.


Чтобы увидеть всю цепочку вложенных цепочек до процесса загрузки, используйте PID вместо имени:

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

Примечание: Прошла еще одна минута, и команда sleep получает новый PID (8541).

0
ответ дан 21 June 2012 в 10:28

ps -efj может также использоваться для того же.

, Например,

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
0
ответ дан 22 October 2019 в 11:07

Другие вопросы по тегам:

Похожие вопросы: