Recentemente ho avuto necessità di eseguire un pò di tuning su un server Linux, spesso infestato da processi zombie che lo portavano a raggiungere elevatissimi carichi operativi. Dalla descrizione di Wikipedia:
Nei sistemi operativi Unix e Unix-like, un processo zombie o processo defunto è un processo informatico che, nonostante abbia terminato la propria esecuzione, possiede ancora un PID ed un process control block, necessario per permettere al proprio processo padre di leggerne il valore di uscita.
Girovagando alla ricerca di informazioni utili, mi sono imbattuto in un ottimo script, da copiare sui vostri server, in grado di identificare e killare lo zombie, oltre a lasciarne una traccia un un file di log apposito.
Lo script kill-zombie
Come prima cosa, creeremo (con i permessi di root) un nuovo file kill-zombie
vi kill-zombies
In seguito copiamo il seguente codice ed incolliamolo nel file appena creato
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #! /bin/bash # # Zombie processes killing script. Must be run under root. case "$1" in --admin) stat=`ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print"pid: "$3" *** parent_pid: "$4" *** status: "$10" *** process: "$13}' | grep ": Z"` if ((${#stat} > 0));then echo zombie processes found: echo . ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print"pid: "$3" *** parent_pid: "$4" *** status: "$10" *** process: "$13}' | grep ": Z" echo -n "Kill zombies? [y/n]: " read keyb if [ $keyb == 'y' ];then echo killing zombies.. ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print$4" status:"$10}' | grep "status:Z" | awk '{print $1}' | xargs -n 1 kill -9 fi else echo no zombies found! fi ;; --cron) stat=`ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print"pid: "$3" *** parent_pid: "$4" *** status: "$10" *** process: "$13}' | grep ": Z"` if ((${#stat} > 0));then ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print$4" status:"$10}' | grep "status:Z" | awk '{print $1}' | xargs -n 1 kill -9 echo `date`": killed some zombie processes!" >> /var/log/zombies.log fi ;; *) echo 'usage: kill-zombies {--cron|--admin}' ;; esac exit 0 |
Ora rendiamolo eseguibile e spostiamolo in /usr/bin
mv kill-zombies /usr/bin
Funzionamento
Lo script viene evocato con un flag, che ne modifica il comportamento:
kill-zombies --admin
L’esecuzione avviene manualmente. Se vengono rilevati processi zombie l’utente ne viene informato e deve confermare l’operazione
kill-zombies --cron
Lo script dovrà essere inserito nel crontab e richiamato quindi a cadenze regolari dal server. I processi vengono killati in automatico e ne viene lasciata traccia in /var/log/zombies.log
Inserimento nel crontab
Richiamiamo l’editor del crontab con questo comando
Ed inseriamo questa riga
In questo modo, lo script verrà eseguito ogni 10 minuti a cadenza regolare. In caso si voglia modificare l’intervallo di tempo, sarà sufficiente cambiare ad esempio */10 in */5 (per 5 minuti)
Riferimenti: Automatic “zombie” processes killing (shell script) | CronHowto
Download: script per killare i processi zombie in un server LinuxIncoming search terms:
- ammazzare processo zombie
- processi zombie
- processso zombies
- uccidere processo linux








One Pingback/Trackback
29 March 2013 at 9:03pm- Buon ottavo compleanno! - Lo Skyblog
[...] a chi ancora oggi arriva qua alla ricerca di questo, quello o quell’altro ...
Pingback: Buon ottavo compleanno! - Lo Skyblog