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

Среда программирования Unix ... С 1983/4 ?

Я, честно говоря, не уверен, сколько будет использовать их терминальный материал. Bash немного изменился с тех пор ... Подождите, Bash не существовало до 89 года.

Это хорошая книга (я пытался ее прочитать, пока учился в университете, и с треском провалился), но вы не можете взять примеры, как написано. Хотя многое из C все еще должно работать.

49
задан 16.01.2020, 14:33

3 ответа

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

echo $PPID

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

cat /proc/$PPID/comm

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

cat /proc/$PPID/cmdline

Пояснение

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

Проверьте man proc

8
ответ дан 16.01.2020, 14:34
  • 1
    Это - лучший ответ. procfs является API ядра. выполните команду и проанализируйте вывод, ерунда. – Philip Oakley 16.01.2020, 14:34
  • 2
    Это является также потенциально самым портативным, PPID определяется как часть стандарта POSIX так любой POSIX, совместимая оболочка должна устанавливать это соответственно. См. pubs.opengroup.org/onlinepubs/9699919799/utilities/… – Community 16.01.2020, 14:34

Используя 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).

2
ответ дан 16.01.2020, 14:34
  • 1
    @Olorin В обоих примерах, Вы могли grep на 807 или cron и та же строка, будет возвращен, а также больше детей, если порождено. Но вопрос был о нахождении родителя, не всех детей. – Community 16.01.2020, 14:35
  • 2
    Я didn' t говорят что-либо об уничтожении чего-либо. Просто для уточнения, теперь you' ре утверждая, что провожение первой строки pstree или захват для названия команды будут всегда давать родительский PID? – Javamann 16.01.2020, 14:35
  • 3
    В Вашем примере, этот метод wouldn' t работали на процесс крона с PID 807. – Shashank 16.01.2020, 14:35
  • 4
    Точно - как Вы находите родителя PID 807 с тем выводом? Вы can' t, becvause это doesn' t включают родителя 807. – guyumu 16.01.2020, 14:36
  • 5
    @Olorin родитель крона является systemd, который является PID 1. Я don' t думают, что можно уничтожить PID 1. – basin 16.01.2020, 14:36

Как получить родительский 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)
    
58
ответ дан 16.01.2020, 14:35
  • 1
    Вы знаете о способе сделать выставочные вызовы pstree (команда + аргументы), не разделяя строки? Моя установка автоматически разделяет строки, если я добавляю аргументы, даже если результат мог бы легко соответствовать на одной строке. В странице справочника, кажется, говорится так же, но doesn' t приводят причину. Мое обходное решение включает извлечение PID' s от pstree и использования ps -o args ... на результатах, но это имеет что-то вроде запаха. – Philip Oakley 16.01.2020, 14:35
  • 2
    Просто что-то, что удивило меня: пространство после ppid= , но перед изодромным с предварением, кажется, необходимо. Я получил различные результаты, если я опустил его. – Philip Oakley 16.01.2020, 14:36

Теги

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