Risposte:
Oh Dio! No no no Non usare kill -9.
Non dà al processo la possibilità di pulire in modo chiaro:
chiudere le connessioni socket
ripulire i file temporanei
informare i suoi figli che sta andando via
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.
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.
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
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, wait
editato 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.
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.
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.