Script per riavviare apache nel caso in cui muoia Saturday, 27 September 08

Ultimamente ho avuto qualche problema con il server che per qualche motivo quando fa la rotazione dei log di tanto in tanto fa morire il processo di Apache.

Modificare lo script di post-rotation per fargli eseguire un restart invece di un reload di Apache non ha prodotto risultati e dagli oscuri log che Apache produce prima della morte il problema non sembra essere particolarmente semplice da tracciare.

Mentre investigo meglio per tentare di sistemarlo non posso certo stare col server down di domenica mattina, e di sabato notte probabilmente non sono in condizioni di pensare che devo riavviare il server ;) (muore alle 4 di notte, perchè è in quel momento che il cron settimanale parte per eseguire la log rotation).

La toppa più semplice che si possa mettere consiste in uno script che quando vede Apache morto lo fa ripartire. Di solito questi script sono abbastanza invasivi e poco affidabili. Ad esempio può accadere che riavviino il server anche se lo si blocca manualmente per un attimo durante la normale amministrazione del sistema. Per correre ai ripari ne ho scritto uno leggermente più furbo che si può configurare per controllare Apache ogni N secondi e riavviarlo solo se lo trova morto per un determinato numero di volte consecutive.
#!/bin/bash

RESTARTS=0
COUNT=0
MAXCOUNT=3
INTERVAL=60
PORT=80

while [ 1 ]
do
    echo -e "GET / HTTP/1.0\n\n" | nc localhost $PORT > /dev/null
    if [ "$?" != "0" ]
    then
        COUNT=$(($COUNT+1))
        echo -n "Apache is down! Already seen down $COUNT times"
        echo ", Restart after $MAXCOUNT times"
        if [ "$COUNT" == "$MAXCOUNT" ]
        then
            echo "*** RESTARTING APACHE ***"
            COUNT=0
            RESTARTS=$(($RESTARTS+1))
            /etc/init.d/apache2 restart
        fi
    else
        COUNT=0
        echo -n "Apache is OK, next poll in $INTERVAL seconds"
        echo ", Restarts so far $RESTARTS"
    fi
    sleep $INTERVAL
done
Lo script utilizza netcat e fa una richiesta di tipo GET per controllare che tutto sia apposto, per cui funzionerà anche nel caso in cui il processo esiste ancora ma non risponde più alle connessioni esterne (scenario che ho visto più volte).

È abbastanza facile modificarlo per fare spedire una email all'amministratore del sistema ogni qual volta viene effettuato un riavvio forzato, in ogni caso lo scriot "logga" sullo standard output il numero di volte che ha riavviato Apache.

Spero che non ne avete bisogno ma... non si sa mai :)

9 commenti
home