Как получить родительский pid из данного pid детей?
Я знаю, что могу вручную проверить его в / proc, мне интересно, есть ли умный / лучший способ добиться этого в Ubuntu. Обратите внимание, что родитель может или не может быть убит.
Благодаря
echo $PPID
, если вам нужна команда из этого родительского pid:
cat /proc/$PPID/comm
, если вам нужна полная командная строка (со всеми параметрами):
cat /proc/$PPID/cmdline
$PPID
определяется оболочкой, это PID родительского процесса /proc/
у вас есть несколько папок с PID каждого процесса. Затем, если вы cat /proc/$PPID/comm
, вы выводите имя команды 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)
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).
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]