Che cos'è un processo di zombi e come lo uccido?


Risposte:


17

Oh Dio! No no no Non usare kill -9.

Non dà al processo la possibilità di pulire in modo chiaro:

  1. chiudere le connessioni socket

  2. ripulire i file temporanei

  3. informare i suoi figli che sta andando via

  4. ripristinare le caratteristiche del terminale e così via e così via e così via.

In genere, invia 15 e attendi un secondo o due, e se non funziona, invia 2 e, se non funziona, invia 1. In caso contrario, RIMUOVI IL BINARIO perché il programma si comporta male!

Non usare kill -9. Non tirare fuori la mietitrebbia solo per mettere in ordine il vaso di fiori.


13
uccidere -9 non ucciderà gli zombi. Devi uccidere il loro genitore, guarda pstree.
LapTop006,

3
@ LapTop006: In quel caso sono più simili ai vampiri; uccidi il capo vampiro per fermare l'invasione.
anfetamachina,

2
Questa risposta è sbagliata in quasi tutti i modi. Il processo è completo; ha già chiuso le connessioni, ripulito i file temporanei, ecc. ecc. Non esiste più alcun processo, ma solo una voce nella tabella dei processi. Non rimuovere il file binario figlio: non si comporta male. Significa solo che il genitore non ha ancora tenuto un funerale adeguato per suo figlio.
Ken Williams,

19

Il processo di zombi (attualmente si chiamano <defunct>) non è in realtà un processo. È solo una voce nella tabella dei processi, quindi il processo genitore può fare wait()syscall .

Non dovresti preoccuparti di loro. Non occupano alcuna risorsa, spariranno o quando il loro genitore chiama wait()quando il genitore stesso muore.



9

C'è già una risposta accettata, tuttavia: PUOI uccidere il processo degli zombi. Collegare con il debugger al processo padre e chiamare la funzione waitpid. Ad esempio: - supponiamo che il genitore abbia PID = 100, il processo di zombi abbia PID = 200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit

Interessante. Ci proverò.
ewwhite,

8

Un processo di zombi non ha risorse allocate ad esso in alcun modo, tranne la voce nella struttura del processo. Ciò accade quando un processo viene completato, tuttavia il processo padre non lo ha ancora raccolto , (ovvero, waiteditato su di esso).

Puoi provare a forzare il genitore a farlo se lo desideri inviandogli un SIGCHLD ( kill -20), al genitore, ma non c'è garanzia che il genitore lo onorerà.

Li vedrai spesso per brevi periodi di tempo (ad esempio durante la visualizzazione dell'albero del processo usando top) - questo è normale; Nell'intervallo di tempo che intercorre tra il tempo in cui un processo figlio viene completato e il genitore ne esegue il polling, il processo figlio verrà visualizzato come uno zombi.

Se vedi processi zombi che esistono continuamente - il che non è normale - non è ancora necessario preoccuparsi - di nuovo poiché non vi sono risorse assegnate a un processo morto - significa generalmente che l'applicazione è scarsamente scritta da sviluppatori schifosi.

L'unica volta che dovresti preoccuparti dei processi di zombi, è quando ne vedi un sacco e tanti, ad esempio se la stessa applicazione scadente menzionata sopra viene messa sotto carico.

Abbiamo un sacco di schifosi sviluppatori in cui lavoro, e quindi ho il privilegio di affrontare tali problemi e imparare ogni sorta di cose inutili mentre lo faccio. In effetti - il mio team ricorre spesso all'utilizzo delle sceneggiature scadenti scritte da sviluppatori schifosi nelle interviste - se il candidato può scegliere che la sceneggiatura è davvero schifosa e dirci perché è scadente, ha un buon piede nella porta.


0

Per quanto riguarda il fucile virtuale ...

$ shoot <pid>
#! / Bin / sh
vittima = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{print $ 2}' '
victim \ _name = `ps -e -o pid, cmd | egrep "^ \ s * $ {victim} \ b" | head -n 1 | awk '{print $ 2}' '
#kill $ {victim}
echo "Killed $ {victim_name}."

E ricorda: sparagli sempre in testa.


Mi dispiace, ma per la cronaca, questo script ha un refuso "victim_name" e ucciderà il genitore del PID dato su $ 1, in ogni caso considera se PID è l'unico zombi o se ha dei fratelli, è solo uccide il padre e con esso tutta la famiglia perirà.
Marc Riera,

-1

Un processo zombi è un processo che ha terminato l'esecuzione, ma è ancora elencato nella tabella dei processi.

kill -9 [parent process_name] lo eliminerà , con estremo pregiudizio.


uccidere -9 non ucciderà un processo di zombi - questo è uno dei motivi per cui sono chiamati zombi. Un "processo" di zombi non andrà via finché il suo codice di ritorno non viene raccolto da un processo genitore.
Mei,

3
No, kill -9 su CAPOGRUPPO ucciderà il genitore, rendendo init è con i genitori, che WILL raccogliere codice di ritorno del bambino.
Alan,
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.