sviluppo-web-qa.it

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

Fucili virtuali?

38
jldugger

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.

17
Severe_admin

Processo di zombi (in realtà ora si chiamano <defunct>) Non è in realtà un processo. È solo una voce nella tabella dei processi, quindi il processo parent 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.

20
vartec

C'è già una risposta accettata, comunque: 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
11
ondra

È un processo che è stato completamente deallocato ma esiste ancora nella tabella dei processi. Contrasto con un processo Orphan, il cui genitore è morto ma è ancora in esecuzione.

Eccoalcuniconsigli su come sbarazzarsene.

10
nedm

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

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

Li vedrai spesso per brevi periodi di tempo (ad esempio durante la visualizzazione dell'albero dei processi 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 allocate a un processo morto - significa generalmente che l'applicazione è mal scritta da sviluppatori maledetti.

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 di apprendere ogni sorta di cose inutili mentre lo faccio. In effetti, il mio team ricorre spesso all'utilizzo delle sceneggiature Shell scadenti scritte da sviluppatori schifosi nelle interviste - se il candidato può scegliere che la sceneggiatura è davvero schifosa e dirci perché è schifosa, ha un buon piede nella porta.

8
Xerxes

Per quanto riguarda il fucile virtuale ...

 $ shoot <pid> 
 #!/bin/sh 
 victim = `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.

0
drybjed