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= 2072restituisce 2061, che può essere facilmente utilizzato in uno script, ecc. ps -o ppid= -C foofornisce il PPID del processo con comando foo. È inoltre possibile utilizzare il vecchio stile ps | grep: ps -eo ppid,comm | grep '[f]oo'.ps -f 2072ritorna
UID PID PPID C STIME TTY STAT TIME CMD izx 2072 2061 0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helper
pstreerelazione è 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/…
pstreeper 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 cronun ID processo di 795. Il trisavolo ha anche cronun ID processo di 763.
Se si desidera cercare in base all'ID processo sleepanziché al nome, è possibile utilizzare:
$ pstree -hp | grep 14653
|-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)
Si noti che l' sleepID processo è cambiato in 14653. Il genitore (PID 841) dorme per 1 minuto, si sveglia per una frazione di secondo e quindi avvia un nuovo sleepcomando 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).
807o crone 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.