Eliminare i processi zombie
Un processo è un programma in esecuzione sul sistema che occupa risorse: RAM, CPU, spazio su disco ecc. Le risorse devono chiaramente essere condivise tra più processi.
Sui sistemi *NIX ad ogni processo è associato un PID, identificatore unico di processo, e un PPID, identificatore del processo genitore cioè colui che ha generato il processo.
Ogni processo può avere diversi stati di funzionamento:
- READY: è pronto ad essere eseguito
- RUN: è in esecuzione
- SLEEPING: è in attesa di un evento
- SWAPPED: parte del processo è stata trasferita su disco
- TERMINATED: processo terminato
- ZOMBIE: il processo ha finito la sua esecuzione, ma il genitore non ha registrato il segnale SIGCHLD. Il processo pertanto mantiene ancora allocate delle risorse.
Quando tutto funziona regolarmente i processi non dovrebbero mai trovarsi nello stato ZOMBIE, ma purtroppo non sempre tutto “gira” come dovrebbe.
Come liberare allora le risorse occupate dagli ZOMBIE?
L’unica cosa da fare in questi casi è quella di killare il genitore che ha generato il processo.
Per verificare se esistono processi zombie è sufficiente digitare in una shell il comando:
rao 3599 0.2 3.5 38616 18380 ? S 22:19 0:14 gnome-panel –sm-client-id default1
rao 3605 0.4 4.6 89340 24076 ? S 22:19 0:24 nautilus –no-default-window –sm-client-id default2
Ora siamo a conoscenza dei PID degli zombie (3599 e 3605), a questo punto cerchiamo il processo genitore:
rao 3605 3577 0 Jun14 ? 00:00:24 nautilus –no-default-window –sm-client-id default2
Prima di andare a killare il genitore (3577) è secessario verificare chi sia, perchè questo processo potrebbe essere proprio il programma che state usando.
rao 3577 0.0 1.7 33636 8968 ? Sl Jun14 00:00 gnome-session.bin
Una volta verificato chi sia il genitore (la sesione di gnome in questo caso), e appurato che non sia un processo che ci serve, è possibile killarlo tramite un semplice kill:
il 14 Giugno 2007 alle 23:29
Ottimo articolo!!
il 2 Luglio 2007 alle 00:03
Domandina : “ps aux | grep defu” ci restituisce due righe in cui DEFU non esiste ma esiste DEFAULT ? strana cosa… anche a provarci con forza un mi riesce mica… bo`, usero` il linux sbagliato mi sa`…
il 2 Luglio 2007 alle 13:57
purtroppo non ho più i log delle righe con i processi defunti, magari ho dimenticato qualcosa mentre facevo il copia/incolla
comunque ecco qui un altro risultato
pennega 6437 0.0 0.0 0 0 ? Z 14:46 0:00 [netstat] <defunct>
root 6939 0.0 0.0 3208 832 pts/1 S+ 15:02 0:00 grep defu
il 20 Settembre 2007 alle 16:28
uhmm e se il padre degli zombie fosse init.. pid=1 ?
il 22 Settembre 2007 alle 14:43
il pid 1 mi pare che non possa essere killato e cmq non sarebbe bello killarlo…potreste sempre provare e dire cosa accade
il 12 Febbraio 2008 alle 11:06
Di per se’ la presenza di uno zombie non e’ un grave problema, in quanto esso non occupa
(a differenza di un processo bloccato in stato D) nessuna risorsa nel sistema, tranne la voce
mantenuta nell’output di ps. Pero’ uno zombie occupa comunque una voce nella tabella dei
processi e pertanto se il numero degli zombie cresce si puo’ rischiare di saturare quest’ultima,
rendendo di fatto inutilizzabile il sistema.
tratto da “amministrare linux”
S. Piccardi