Eliminare i processi zombie

Inserito da il14 June 2007, 5790 visite totali

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:

ps aux |grep defu 
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:

ps -def | grep 3605
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.

ps aux |grep 3577
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:

kill -9 3577

8 commenti per “Eliminare i processi zombie”

  1. KaKaShi scrive:

    Ottimo articolo!! 😛

  2. Niubbo scrive:

    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`…

  3. pennega scrive:

    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

    ps aux |grep defu
    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
  4. Dr.Tarr scrive:

    uhmm e se il padre degli zombie fosse init.. pid=1 ?

  5. pennega scrive:

    il pid 1 mi pare che non possa essere killato e cmq non sarebbe bello killarlo…potreste sempre provare e dire cosa accade 😉

  6. sacarde scrive:

    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

  7. f scrive:

    booooooooooooooooo come si fa potete spiegare + semplicemente

  8. Pietro scrive:

    Complimenti alla comunità, e grazie per i dettagli.
    Sono ancora un novizio.

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *