Come uccidere i processi Zombie in Linux – Semplicemente non è possibile

LINUX, TUTORIAL

Un “processo zombie” è il risultato di un processo che sebbene sia terminato resta presente nella tabella dei processi.

La definizione appena data non è il massimo, ma lascia intendere che di fatto è  errato parlare di processo in senso stretto; la definizione di processo, infatti, specifica che si tratta di  una istanza di un programma, a cui sono state riservate risorse di memoria, CPU etc…

Uno zombie o defunct, pertanto, non è che un riferimento ( PCB – Process Block controll) nella tabella dei processi a cui non sono più legate risorse. Quindi di fatto non è un processo e  non consuma risorse.

Giusto per completezza ricordo che Il PCB contiene tutte le informazioni del processo relative ad esempio a:

  • stato globale,
  • risorse possedute (memoria centrale, unità di I/O assegnate staticamente, file aperti, ecc.),
  • parametri di schedulazione per l’assegnazione di alcune risorse,
  • valore corrente dei registri del processore,
  • posizione dell’area di swap su disco, informazioni di account, ecc.

Nel caso infatti di un processo defunct l’unica cosa che resta istanziata è l’informazione del suo PCB.

Nel kernel Linux, ogni processo è rappresentato da a task_structin un elenco, il cui processo principale  è init_task(pid 0, non pid 1). Questo elenco è comunemente noto come tabella dei processi .

In modalità utente, la tabella dei processi è visibile agli utenti normali in /proc da cui il sistema operativo estrae le informazioni. I dati pertanto che vengono registrati nella proc sono:

  • I dati di identificazione del processo sono l’ID del processo (che si trova nel percorso /proc/<process-id>/...), la riga di comando ( cmd) e possibilmente altri attributi a seconda della definizione di “identificazione”.
  • I dati sullo stato del processo includono i dati di pianificazione ( schedstatschedstat), ciò che il processo è attualmente in attesa ( wchan), il relativo ambiente ( environ) ecc.

N.B

Preoccuparsi di “killare” un processo zombie con la speranza di recuperare risorse è di per se inutile.

La domanda successiva potrebbe essere, come posso ripulire la tabella dei processi?

Vediamo alcune vie: Se il processo Zombie è collegato ad un processo padre è possibile “killare” il processo zombie banalmente agendo sul processo padre.

Sarà sufficiente pertanto ricerca il PPID del processo padre ed inviare al sistema il segnale di kill corretto.

Per trovare il processo padre che ha generato il fork del processo figlio diventato zombie sarà sufficiente eseguire:

ps a -eF | egrep "Z|defunct"

il risultato sarà qualcosa del genere:

a questo punto identificato il PPID ( parent PID) sarà sufficiente eseguire il comando di kill

kill -s SIGCHLD <Parent PID>

non sempre però il comando di cleaning da esito positivo ed in tal caso sarà necessario eseguire un kill del processo padre eseguendo il seguente comando:

kill -9 <Parent PID>

ATTENZIONE: nel caso il cui il processo padre fosse 1 ( init) non sarà possibile killarlo ( non  è una buona idea dato che è il processo di sistema) in tal caso sarà necessario riavviare la macchina.

Capita speso infatti che per un processo figlio non si possa gestire o non sia gestita la chiamata alla funzione wait (). Di conseguenza, i processi child  zombi rimarranno nella memoria fino a quando non saranno estinti.

Ciò significa che non sarà possibile inviare il segnale SIGCHLD attraverso il Parent Process che lo ignorerà. Può  capitare anche che  un’altra applicazione stia interferendo con l’esecuzione del processo genitore che ne blocca il corretto funzionamento.

In ogni caso in queste o altre situazioni non sarà possibile fare il cleaning dei processi defunct.

Se vuoi farmi qualche richiesta o contattarmi per un aiuto riempi il seguente form

    Comments