Chi ha un po' di dimestichezza con i sistemi Unix-lke, ed in particolare con le distribuzione Linux, avrà sicuramente individuato un processo zombie in corso sulla propria piattaforma. Si tratta di un processo che, nonostante abbia terminato la propria esecuzione, possiede ancora un PID ed un Process control block. Il nostro articolo di oggi si focalizza proprio su tale tipologia di processi.
I "processi zombie" nascono per consentire al processo padre di poter leggere il valore di uscita di un processo figlio. Quando un processo termina, tutta la memoria e le risorse ad esso associate vengono liberate così da poter essere utilizzate da altri processi; tuttavia ll process control block del processo resta nella tabella dei processi (process table) affinché il processo padre possa leggerne il valore di uscita eseguendo una chiamata di sistema (wait()), dopo tale operazione il processo viene rimosso in modo definitivo.
Un "processo zombie" può dunque nascere da un errore del processo padre ma può anche essere generato di proposito, ad esempio quando il processo padre vuole assicurarsi che un nuovo processo figlio abbia un PID diverso da un figlio creato in precedenza e appena terminato.
Tali processi non utilizzano risorse della CPU, ma finché rimangono "attivi" vengono immagazzinati all'interno della RAM e nei sistemi con poche risorse questo può rappresentare un problema. Nei sistemi operativi Unix-like è dunque stato implementato un sistema per individuare rapidamente i processi zombie tramite il comando ps
:
ps aux | grep Z
Di solito i processi vengono terminati tramite SIGKILL, ma i "processi zombie" sono per definizione già "morti", dunque è necessario usare SIGCHLD:
kill -s SIGCHLD pid
Al posto di "pid" si dovrà inserire l'id del "processo zombie" che desideriamo terminare. Trovare e terminare in modo definitivo un processo zombie è dunque abbastanza semplice e, se un programma è stato scritto bene, probabilmente integra anche una funzione automatica con cui eliminare tale tipologia di processi senza dover interpellare l'utente.
Via LaU