Zombie
Il nostro sistema operativo è responsabile di molte attività, tra cui la gestione dei processi. Tuttavia, i processi che vengono lanciati (magari software complessi) possono generare altri processi: chiamati “processi figli”. In poche parole, un processo è un’istanza di un programma in esecuzione. Può essere in primo piano (processo interattivo) o in background (processo non interattivo o automatico), processo padre (creatore di altri processi durante il runtime) o figlio (processo creato da altri).
Questo è necessario per capire cosa o chi genera un processo e chi è responsabile della sua corretta uscita.
In Linux, ad eccezione del primo processo init (o systemd) con PID 0, ogni altro processo ha un processo padre.
Processi zombi e dove trovali
Quando un processo figlio muore, il processo padre viene informato in modo che possa eseguire alcune operazioni di pulizia come liberare memoria, gestire l’exit code, ecc. Il processo figlio passa allo stato zombie, se il processo padre non è a conoscenza della sua morte. Per il processo genitore, il figlio esiste ancora anche se è effettivamente morto. Questo è il modo in cui i processi zombie (noti anche come processi defunti) vengono creati e restano monitorati.
Dobbiamo preoccuparci degli zombie?
E’ importante dire che i processi zombie non sono così pericolosi come potrebbero sembrare, ma possono sorgere problemi legati alla disponiblità di risorse (di solito la RAM). La maggior parte dei processi Linux può avere il PID massimo impostato su 32768 (id progressivo). Se non sono disponibili ID per altre attività, il sistema potrebbe bloccarsi. Questo accade raramente, ma è una possibilità, specialmente se un programma mal codificato inizia a indurre numerosi processi zombie. In tal caso, sarebbe una buona idea trovare e uccidere il processo di zombie.
Un processo zombie è identificato dalla lettera “Z” ed è possibile averne visibilità lanciando il comando top
Come potete notare c’è un processo zombie.
Come gestiamo la cosa? Un processo zombie può essere ucciso?
Un processo zombie è già morto. Come si uccide un processo già morto?
Potremmo provare a sparargli in testa, oppure bruciarlo, ma dubito che in questo caso funzioni.
Alcune persone suggeriscono di inviare il segnale SIGCHLD al processo padre, ma è molto probabile che venga ignorato. Un’altra opzione è uccidere proprio il suo processo padre: sembra un po’ brutale, ma è l’unico modo sicuro per uccidere tutti i processi zombie.
Come prima cosa cerchiamo di identificare i processi zombie
ps aux | awk '$8 ~ /^[Zz]/'
identifichiamo il padre (l’id)
ps -o ppid= -p <child_id>
ora procediamo con la pulizia
kill -9 <parent_process_ID>
Possiamo verificare che il processo figlio (zombie) non sia più presente.
Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.
Risorse: