Come si uccide un albero dei processi in Linux? [chiuso]


14

A volte, l'invio di un SIGTERM a un processo provoca l'invio di SIGTERM a tutti i suoi processi figlio. Tuttavia, a volte questo non funziona.

Esiste un comando o un'utilità che mi permetterà di uccidere un processo e tutti i suoi processi figlio contemporaneamente? Di solito ricorro a raccogliere manualmente tutti i pid in un solo comando kill, ma mi sembra stupido.

Questa domanda SO chiede come farlo con perl, ma tutto ciò che ottiene il lavoro sarebbe fantastico.


Sembra che pkill -9sia più potente di pkill, per qualsiasi motivo.
Andrew,

Risposte:



13

Supponendo che i processi condividano un identificatore di sessione (cosa che dovrebbero fare a meno che non abbiano esplicitamente chiamato setsid (), è possibile ucciderli per sessione usando pkill:

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

Se da un altro terminale lo faccio:

pkill -9 -s 12804

Quindi tutto muore in un colpo solo.

Allo stesso modo puoi uccidere per gruppo di processo, anche se questo tende ad essere più utile per molti bambini che sono tutti a un livello inferiore a un genitore, non una catena di processi associati.


2

Di solito, un cliente rispondente dovrebbe ricevere un sigterm e fuori di sé, interrompendo così tutti i suoi processi figlio biforcuti. Se, d'altra parte, il client non risponde, probabilmente un segnale di terminazione normale non susciterà alcuna risposta.

Quindi si procede quindi all'invio di un SIGKILL, che indica al sistema stesso di interrompere quel processo, Now - che può fare la maggior parte delle volte, tranne quando il processo è in uno stato di ininterruzione del sonno, come attendere un I / O input o simili.

In tal caso, anche il SIGKILL finirà per non fare nulla al processo; il processo figlio probabilmente si troverà in un simile stato di ritardo.

Esiste un caso limite in cui il processo padre potrebbe terminare in modo corretto, ma il processo figlio non è eseguibile. Quindi finirai con un processo di zombi che non può essere ripulito poiché suo padre non c'è più, ma non risponde a nulla. L'unico modo per sbarazzarsi di questi è un riavvio; nella maggior parte dei casi, tuttavia, sono abbastanza innocui, poiché l'unica cosa che fanno è prendere un PID mentre qualsiasi socket che hanno provato a usare è già appassito.


2

Se voglio uccidere l'albero dei processi di Firefox, allora è possibile ucciderlo con il comando sopra "pkill -9 -s firefox"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.