Modo alternativo per uccidere un processo di zombi


19

Ho appena notato alcuni processi di zombi su CentOS 6.8 (Final), ho provato a ucciderli ma sono ancora lì:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

Come puoi vedere sono in esecuzione da due mesi, e anche se non fossero dannosi mi sbarazzerei di loro, un modo alternativo per uccidere uno zombi?


1
hai provato kill -9?
Ipor Sircer,

7
Solo 747e 29971sono processi di zombi. Gli altri potrebbero essere rinchiusi ma non sono ancora morti.
roaima,

Sembra che tu abbia un bug in qualche codice in esecuzione su Tomcat ...
Boris the Spider

Risposte:


8

Come accennato da Heemayl, non puoi davvero uccidere uno zombi. È già [un] morto ...

Tuttavia, il problema riscontrato si presenta come un problema con il git clonecomando. Si blocca in qualche modo. Probabilmente va in timeout o fallisce in qualche altro modo? È spesso a causa di alcuni I / O che un processo si blocca al punto in cui a SIGTERMe SIGINTnon funzionerà.

Per ucciderlo, in questo caso, si desidera utilizzare l' -9opzione della riga di comando. Questo significa inviare il SIGKILLsegnale. In realtà puoi -KILLanche usare .

[root@host user]# kill -KILL 746 29970

Per ottenere un elenco di segnali disponibili, utilizzare l'opzione della riga di comando elenco.

[root@host user]# kill -l

Questo ti mostra i numeri e i nomi (e vedrai che # 9 dice SIGKILL.)


1
In realtà è kill -KILLstato l'unico comando in grado di chiudere questi processi, per questo accetterò la risposta di @Alexis Wilke. Ma sicuramente desidero esprimere la mia gratitudine per la risposta rapida, saggia e molto istruttiva di @heemayl +1. Grazie a tutti
lese

39

Non puoi uccidere uno Zombi (processo), è già morto. Sta solo aspettando che il suo processo padre esegua wait(2)e raccolga il suo stato di uscita. Non richiederà alcuna risorsa sul sistema se non una voce della tabella dei processi.

Puoi inviarlo SIGCHLDal suo genitore per far sapere che uno dei suoi figli è terminato (es. Richiedi che raccolga lo stato di uscita del figlio). Questo segnale può essere ignorato (che è l'impostazione predefinita):

kill -CHLD <PPID>

(Sostituisci <PPID>con il PID effettivo del genitore.)

Oppure puoi uccidere il processo genitore in modo che init(PID 1) erediti il ​​processo zombi e lo raccolga correttamente (è uno dei initcompiti principali ereditare qualsiasi orfano e farlo wait(2)regolarmente). Ma uccidere il genitore non è raccomandato. Generalmente, la creazione di processi zombi indica problemi / problemi di programmazione e dovresti invece provare a risolverli o segnalarli.


8
Puoi inviare SIGCHLD al suo genitore per fargli sapere che uno se i suoi figli sono terminati (cioè richiederlo per raccogliere lo stato di uscita del bambino), questo segnale può essere ignorato (impostazione predefinita) Il problema è che se un processo ignora SIGCHLD, nessuno zombi sarebbe stato creato. Quindi, se non viene ignorato SIGCHLDe gli zombi non vengono raccolti, il processo è difettoso o non si preoccupa dei bambini zombi. Dato che il processo in questione è git clone ..., sto scommettendo che semplicemente non gli importa dei bambini zombi poiché è un processo (si spera) di breve durata che fa il suo lavoro e poi esce.
Andrew Henle,

1
@AndrewHenle: Anche se questo è per lo più vero, l'azione predefinita ( SIG_DFL) per SIGCHILDè anche quella di ignorarlo, ma in questo caso gli zombi certamente non vengono raccolti automaticamente.
R ..

@R Anche se questo è per lo più vero, l'azione predefinita ( SIG_DFL) per SIGCHILDè anche quella di ignorarlo, ma in questo caso gli zombi certamente non vengono raccolti automaticamente. Non sono sicuro di cosa ti riferisca. Ti riferisci ai processi che non vengono raccolti nella domanda? Non vedo come l'invio SIGCHLDa un processo in cui il SIGCHLDgestore è impostato su SIG_IGN(esplicitamente o per impostazione predefinita) provocherà la raccolta di eventuali zombi da parte di tale processo.
Andrew Henle,

1
@AndrewHenle, questa volta l' invio di SIGCHLDpotrebbe funzionare . L'ultima volta potrebbe essersi perso il segnale o due bambini sono morti contemporaneamente e il codice non è abbastanza intelligente da gestire entrambi i decessi contemporaneamente.
Alexis Wilke,

Non può far male, ma non ci metterei le probabilità che funzioni.
Barmar,

2

per cercare processi di zombi:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

per uccidere il processo di zombi, gli ID dei genitori devono essere uccisi, ad esempio PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

Quando un processo genitore muore, tutto il processo degli zombi verrà ripulito. Non uccidere il processo genitore solo per ripulire il processo di zombi. Verrà di nuovo quando eseguirai nuovamente il programma. Risolvi il tuo programma chiamando correttamente la chiamata di sistema "wait ()" o "waitpid ()".

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.