Znajdź potomków procesu

15

czy jest jakiś sposób, aby dowiedzieć się, kim są dzieci określonego procesu? na przykład te dzieci, których identyfikator rodzica to foo?

Mohammad Reza Rezwani
źródło

Odpowiedzi:

26

Szukasz pstreepolecenia. pstreesam wylistuje wszystkie procesy w formie drzewa (podobnie jak lsblkrobi). Możesz użyć -pflagi, aby wyświetlić również PID, a także -saby pokazać proces nadrzędny:

$ pstree -p 602
udisksd(602)-+-{cleanup}(607)
             |-{gdbus}(605)
             |-{gmain}(603)
             `-{probing-thread}(606)

(Prawdopodobnie) zgodny ze standardem POSIX sposób uzyskiwania potomnych identyfikatorów PID (o czym wspominałem w innych komentarzach):

ps -o ppid= -o pid= -A | awk '$1 == <some pid>{print $2}'

Mówi psto o zapisaniu nadrzędnego PID i PID wszystkich procesów (bez nagłówków), a następnie używa, awkaby zobaczyć, które linie mają dany PID w pierwszym polu (nadrzędny PID), i wypisuje odpowiednie drugie pole (podrzędny PID).

muru
źródło
10

Jeśli chcesz tylko zobaczyć bezpośrednie elementy potomne procesu, którego PID to 123, możesz użyć opcji pspolecenia --ppid:

ps --ppid 123

Możesz połączyć to z pidofpoleceniem, aby uzyskać potomki procesu według nazwy, tj. Biorąc pod uwagę proces o nazwiefoo

ps --ppid $(pidof foo)
steeldriver
źródło
10

Inną opcją jest użycie Monitora systemu (jest fabrycznie zainstalowany). W SM Menubar zaznacz opcję „Zależności”, pod „Widok”, aby mieć wizualną informację zwrotną, pokazującą procesy nadrzędne i potomne, takie jak pokaz na zrzucie ekranu poniżej.

Sam wolę CL (wiersz poleceń) i sugeruję, że ci, którzy używają Linuksa, w tym przypadku Ubuntu na co dzień, mądrze inwestują swój czas w naukę podstawowych poleceń, zamiast aplikacji GUI, lub przynajmniej są w stanie opanować oba pewien stopień!

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

v2r
źródło
1
OT: Jaki to temat?
muru
1
Używam Ubuntu + GnomeShell 3.2.1. Motyw nazywa się „AdwaitaDark”, który jest motywem GTK3, ale jest dostosowany i niedostępny, jak widać na zrzutach ekranu.
v2r
6

Nie jestem ekspertem, ale czytając powyższe odpowiedzi, wydawało mi się, że istnieje prawdopodobnie bardziej bezpośredni sposób, aby to zrobić za pośrednictwem systemu plików proc, np. Do celów programistycznych w skrypcie, a nie do wyświetlania przez człowieka. I rzeczywiście jest tak: dla procesu o kodzie ID $ mypid jego procesy potomne są wymienione w

/proc/$mypid/task/$mypid/children

na przykład

$ cat /proc/3123/task/3123/children 
3131 3133

Podobnie można uzyskać identyfikator procesu nadrzędnego poprzez wpis „PPid” w pliku

/proc/$mypid/task/$mypid/status

na przykład

$ grep PPid /proc/3131/task/3131/status
PPid:   3123
$ grep PPid /proc/3131/task/3131/status | cut -f2
3123

Nie jestem jednak pewien, jak przenośne jest to poza systemami Linux.

andybuckley
źródło
1
Jeśli problem dotyczy przenośności: ps -o ppid= -o pid= -A | awk '$1 == <some pid>' | cut -f2powinien być zgodny z POSIX.
muru