Come ottenere il pid genitore da un determinato pid figlio?
So di poterlo controllare manualmente in / proc, mi chiedo se ci sia un modo intelligente / migliore per farlo in Ubuntu. Nota che il genitore può o meno essere ucciso.
Grazie
Come ottenere il pid genitore da un determinato pid figlio?
So di poterlo controllare manualmente in / proc, mi chiedo se ci sia un modo intelligente / migliore per farlo in Ubuntu. Nota che il genitore può o meno essere ucciso.
Grazie
Risposte:
Uso ps -o ppid=
ps -o ppid= 2072
restituisce 2061
, che può essere facilmente utilizzato in uno script, ecc. ps -o ppid= -C foo
fornisce il PPID del processo con comando foo
. È inoltre possibile utilizzare il vecchio stile ps | grep
: ps -eo ppid,comm | grep '[f]oo'
.ps -f 2072
ritorna
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
relazione è pstree -s -p 2072
:
init (1) ───pulseaudio (2061) ───gconf-helper (2072)
ppid=
ma prima del pid sembra essere necessario. Ho ottenuto risultati diversi se l'ho omesso.
echo $PPID
se hai bisogno del comando da questo pid genitore:
cat /proc/$PPID/comm
se hai bisogno della riga di comando completa (con tutte le opzioni):
cat /proc/$PPID/cmdline
$PPID
è definito dalla shell, è il PID del processo genitore/proc/
, hai alcune dir con il PID di ogni processo. Quindi, se si cat /proc/$PPID/comm
, si fa eco al nome del comando del PIDPPID
è definito come parte dello standard POSIX, quindi qualsiasi shell conforme a POSIX dovrebbe impostarlo in modo appropriato. Vedi pubs.opengroup.org/onlinepubs/9699919799/utilities/…
pstree
per nome comandoUtilizzando pstree
è possibile cercare il nome del processo figlio e ottenere l'ID processo (PID) insieme ai genitori, ai nonni e a tutti i figli del processo figlio:
$ pstree -hp | grep sleep
|-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)
In questo caso sleep
è il comando figlio ed è PID 8414
. L'ID padre è 841 e viene chiamato display-auto-brightness
. Il nonno è una shell ( sh
) con un ID processo di 839
. Il bisnonno ha cron
un ID processo di 795
. Il trisavolo ha anche cron
un ID processo di 763
.
Se si desidera cercare in base all'ID processo sleep
anziché al nome, è possibile utilizzare:
$ pstree -hp | grep 14653
|-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)
Si noti che l' sleep
ID processo è cambiato in 14653
. Il genitore (PID 841) dorme per 1 minuto, si sveglia per una frazione di secondo e quindi avvia un nuovo sleep
comando che ottiene un nuovo ID processo. Questo è un altro motivo per cui la ricerca sleep
è più semplice della ricerca per ID processo.
Questo codice è stato preso da: Regola automaticamente la luminosità del display in base all'alba e al tramonto e adattato a questa domanda.
Per visualizzare una catena nidificata completamente indietro per avviare il processo, utilizzare il PID anziché il nome:
$ 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
Nota: è trascorso un altro minuto e il comando sleep ottiene un nuovo PID (8541).
807
o cron
e la stessa linea verrebbe ritrasformata così come più figli se generati. Ma la domanda era di trovare il genitore, non tutti i bambini.
1
. Non credo che tu possa uccidere PID 1.
ps -efj
può essere utilizzato anche per lo stesso.
Per esempio,
> 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]
ps -o args ...
dei risultati, ma questo ha un po 'di odore.