Допустим, я запускаю ps axf
и вижу, что дерево процессов моей команды выглядит так:
800 ? Ss 0:00 /usr/sbin/sshd
10186 ? Ss 0:00 \_ sshd: yukondude [priv]
10251 ? S 0:00 \_ sshd: yukondude@pts/0
10252 pts/0 Ss 0:00 \_ -bash
10778 pts/0 S 0:00 \_ su -
10785 pts/0 S 0:00 \_ -su
11945 pts/0 R+ 0:00 \_ ps axf
Я знаю, что могу проверить $$
для PID текущей оболочки (10785) или $PPID
для родительского PID (10778).
Но я просто хочу родительский PID верхнего уровня, который в этом примере будет 800 (демон SSH).Есть ли способ сделать это легко?
Я узнал от этого ответа SO , что я могу рекурсивно проверить 4-ю запись в файле /proc/PID/stat
, чтобы найти PID родительского процесса каждого процесса:
# cut -f4 -d' ' /proc/10785/stat
10778
# cut -f4 -d' ' /proc/10778/stat
10252
# cut -f4 -d' ' /proc/10252/stat
10251
# cut -f4 -d' ' /proc/10251/stat
10186
# cut -f4 -d' ' /proc/10186/stat
800
# cut -f4 -d' ' /proc/800/stat
1
(родительский PID верхнего уровня будет тот, который непосредственно перед тем, как я получу PID init
, т. Е. 1.)
Перед тем, как написать небольшой цикл (ядаже не уверен, что для этого можно использовать рекурсию в bash), есть ли гораздо более простой метод, который мне не хватает?Может быть, просто еще один параметр файла в /proc
?grep
в этих файлах не обнаружил ничего очевидного.
Edit : Конечно, процесс верхнего уровня для всех процессов Linux - это / sbin / init с PID 1То, что я хочу, это PID родителя перед этим: предпоследний родитель.