Come uccidere i processi Zombie in Linux – Semplicemente non è possibile
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_struct
in 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 (
sched
,stat
eschedstat
), 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.
Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .
Attualmente ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.
Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.
Comments