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 :)
post letto 4840 volte (1.0 letture al giorno in media)
Postato alle 07:47:37 permalink | 9 commenti | stampa | posta | trackbacks

Commenti

straluna Scrive:
27 Sep 08, 09:47:02
Ciao!
Monit non ti piaceva?
Fa tutto quello che ti serve, è leggero ed è scritto bene.

ciao,
a.
antirez Scrive:
27 Sep 08, 09:56:46
@straluna:

Lo script l'ho scritto in circa 3 minuti, e non mi serviva niente di più, ad usare una soluzione diversa solo per capire come funzionava ci avrei messo almeno lo stesso tempo ma avrei decifrato documentazione e modi di fare le cose scritti da altri invece di dedicarmi anche per pochi secondi alla antica arte della programmazione ;)
lobotomia Scrive:
04 Oct 08, 12:03:14
Ti spiace se lo ripubblico su PettiNix (naturalmente citandoti)?
antirez Scrive:
04 Oct 08, 12:10:14
@lobotomia: no assolutamente, consideralo sotto la licenza BSD. A proposito ce l'ho in produzione da quando ho scritto l'articolo e funziona corrattamente dunque è un pò testato ora.
lobotomia Scrive:
04 Oct 08, 16:12:39
@antirez: ok, allora pubblico in settimana.
P.S. ti avevo mandato email ma non ho ricevuto risposta, tropppi impegni o è passata nello spam?
antirez Scrive:
04 Oct 08, 16:54:26
@lobotomia: ok
p.s. ho cercato su gmail e ho visto che è una email di Agosto, praticamente non mi leggevo neppure la posta ad Agosto ;) Scusa se non ti ho scritto prima.

Ti ho aggiuto su gtalk, se ti serve un contatto diverso scrivimi una email o ci vediamo in chat.
lobotomia Scrive:
04 Oct 08, 17:23:21
@antirez; tranquillo sto smadonnando con un motore 3D java, no nè urgente ma appena ci si becca si scambiano due chiacchere :)
angelo Scrive:
04 Nov 08, 05:04:07
ciao...io ho un server linux, volevo sapere se questo script gira anche su linux..e in quale cartella e in quale file installare lo script. Grazie in anticipo
luigi Scrive:
03 Nov 09, 12:37:40
ma dove va inserito sto codice?? corso velocissimo di netcat non si può avere??
Comments closed