Identificare ed uccidere processi Zombie in un server Linux

10 febbraio 2012

Linux & Open Source

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

cd /root
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

chmod +x kill-zombies
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

crontab -e

Ed inseriamo questa riga

*/10 * * * * /usr/bin/kill-zombies --cron

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 Linux

Incoming search terms:

  • ammazzare processo zombie
  • processi zombie
  • processso zombies
  • uccidere processo linux
, ,

One Pingback/Trackback