Есть ли способ узнать, кто дети определенного процесса? например тех детей, у которых их родительский идентификатор foo?
Есть ли способ узнать, кто дети определенного процесса? например тех детей, у которых их родительский идентификатор foo?
Ответы:
Вы ищете pstree
команду.
pstree
сам по себе перечислит все процессы в виде дерева (как lsblk
делает). Вы можете использовать этот -p
флаг, чтобы получить список идентификаторов PID, а также -s
показать родительский процесс:
$ pstree -p 602
udisksd(602)-+-{cleanup}(607)
|-{gdbus}(605)
|-{gmain}(603)
`-{probing-thread}(606)
(Вероятно) POSIX-совместимый способ получения дочерних PID (о которых я упоминал в комментариях в другом месте):
ps -o ppid= -o pid= -A | awk '$1 == <some pid>{print $2}'
Это указывает ps
на запись родительского PID и PID всех процессов (без заголовков), а затем использует, awk
чтобы увидеть, какие строки имеют данный PID в первом поле (родительский PID), и печатает соответствующее второе поле (дочерний PID).
Если вы просто хотите увидеть непосредственных потомков процесса, чей идентификатор PID, 123
вы можете использовать параметр ps
команды --ppid
:
ps --ppid 123
Вы можете объединить это с pidof
командой, чтобы получить дочерние элементы процесса по имени, то есть заданному процессу с именемfoo
ps --ppid $(pidof foo)
Другой вариант - использовать системный монитор (поставляется предварительно установленным). В SM Menubar пометьте опцию «Зависимости» в разделе «Вид», чтобы иметь визуальную обратную связь, показывающую родительский и дочерний процессы, как показано на скриншоте ниже.
Я сам предпочитаю CL (командную строку) и предполагаю, что те, кто использует Linux, в данном случае Ubuntu на ежедневной основе, разумно тратят свое время на изучение основных команд, через приложения с графическим интерфейсом или, по крайней мере, могут освоить и то, и другое. определенная степень!
Я не эксперт, но, читая приведенные выше ответы, мне показалось, что, возможно, есть более прямой способ сделать это через файловую систему proc, например, для программного использования в сценарии, а не для чтения человеком. И действительно, есть: для процесса с идентификатором $ mypid его дочерние процессы перечислены в
/proc/$mypid/task/$mypid/children
например
$ cat /proc/3123/task/3123/children
3131 3133
Точно так же вы можете получить идентификатор родительского процесса через запись "PPid" в файле
/proc/$mypid/task/$mypid/status
например
$ grep PPid /proc/3131/task/3131/status
PPid: 3123
$ grep PPid /proc/3131/task/3131/status | cut -f2
3123
Я не уверен, насколько это переносимо за пределами систем Linux.
ps -o ppid= -o pid= -A | awk '$1 == <some pid>' | cut -f2
должна быть POSIX-совместимой.