Список идентификаторов дочерних процессов
Я хочу получить список всех идентификаторов дочерних процессов для данного идентификатора родительского процесса ( 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ничего не дает ... так что это тоже немного озадачивает.
Это должно быть легко, правда?
Я ценю ваше время.
Ответы
Я хочу получить список всех идентификаторов дочерних процессов для данного идентификатора родительского процесса (
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) добавляет ведущие пробелы).