Список идентификаторов дочерних процессов

Oct 02 2020

Я хочу получить список всех идентификаторов дочерних процессов для данного идентификатора родительского процесса ( 6330 qemu) для использования в bashсценарии.

Я вижу их htop, например:

Лучшие результаты поиска включают:

# pgrep -P 6330
(no output)

# ps --ppid 6330
  PID TTY          TIME CMD

# pstree -p 6330
qemu(6330)-+-{qemu}(6332)
           |-{qemu}(6333)
           |-{qemu}(6340)
           |-{qemu}(6342)
           |-{qemu}(6343)
           `-{qemu}(6344)

... их вывод будет таким же, как если бы они были запущены как rootвладелец qemu.

Результат pstreeработает в крайнем случае, но я бы предпочел не разбирать его, если я могу помочь.

Кроме того ... ps aux | grep 6332и pgrep 6332ничего не дает ... так что это тоже немного озадачивает.

Это должно быть легко, правда?

Я ценю ваше время.

Ответы

2 KamilMaciorowski Oct 02 2020 at 10:35

Я хочу получить список всех идентификаторов дочерних процессов для данного идентификатора родительского процесса ( 6330 qemu) для использования в bashсценарии.

Решение этой точной проблемы есть pgrep -P 6330, но остальная часть вопроса предполагает, что, возможно, «идентификаторы дочерних процессов» - это не то, что вам действительно нужно.

Вы использовали, pgrep -P 6330и результат был пустым, потому что не было дочерних процессов. Что htopи pstreeпоказали вам, были темы . Так что, возможно, вам действительно нужны идентификаторы потоков.

Смотрите это:

  • Почему многие процессы перечислены под одним названием в htop?

    htopпо умолчанию показывает отдельные потоки как отдельные процессы, аналогично тому, как это ps -ALбыло бы. Если вы нажмете заглавную букву, Hон переключится на отображение только основных процессов (повторное нажатие переключает обратно).

  • man 1 pstree:

    Дочерние потоки процесса находятся в родительском процессе и отображаются с именем процесса в фигурных скобках […]

  • Реализованы ли потоки как процессы в Linux?

    В Linux потокам назначались разные PID. Начиная с Linux 2.4 потоки процесса имеют общий PID; это должно удовлетворить POSIX. Терминология усложнилась, «PID» несколько неоднозначен. Из соответствующего ответа на SO :

    Первое и самое важное, что нужно понять, это то, что "PID" означает разные вещи в пространстве ядра и пространстве пользователя. То, что ядро ​​называет идентификаторами PID, на самом деле является идентификаторами потоков уровня ядра (часто называемыми TID), […]. Каждый поток в системе, будь то в одном процессе или в другом, имеет уникальный TID (или «PID» в терминологии ядра).

    С другой стороны, то, что считается PID в понимании POSIX «процесса», в ядре называется «идентификатором группы потоков» или «TGID». Каждый процесс состоит из одного или нескольких потоков (процессов ядра), каждый со своим собственным TID (PID ядра), но все они используют один и тот же TGID, который равен TID (PID ядра) исходного потока, в котором выполняется main.

    Когда topпоказывает вам потоки, он показывает TID (PID ядра), а не PID (TGID ядра), и поэтому каждый поток имеет отдельный.

    Последнее предложение также применимо к htopили pstree.

Если вы все еще хотите , чтобы получить эти различные идентификаторы ( 6332, 6333, ...) для использования в сценарии оболочки, вызывайте это:

ps -o lwp= -Lp 6330

Команда не переносима, она может работать или не работать в вашей ОС. Если это сработает, вы можете исключить основной поток:

ps -o lwp= -Lp 6330 | grep -v '^ *6330$'

( <space>*потому что ps(по крайней мере, мой ps) добавляет ведущие пробелы).