2010-01-30 8 views
12

J'ai écrit un script bash pour redémarrer Apache quand il a pendu et envoyer un courriel à l'administrateur. Le code est montré ci-dessous. le code redémarrera Apache si le nombre de processus Apache est zéro. Le problème est le suivant: Apache se bloque et les processus ne sont toujours pas à zéro, dans ce cas, le script ne redémarrera pas Apache. Le nécessaire est: comment puis-je modifier le code pour redémarrer Apache s'il a pendu et les processus ne sont pas zéro.script bash pour redémarrer Apache automatiquement

#!/bin/bash 
if [ `pgrep apache2 -c` -le "0" ]; then 
/etc/init.d/apache2 stop 
pkill -u www-data 
/etc/init.d/apache2 start 
echo "restarting....." 
SUBJECT="Apache auto restart" 
# Email To ? 
EMAIL="[email protected]" 
# Email text/message 
EMAILMESSAGE="apache auto restart done" 
# send an email using /bin/mail 
/bin/mail -s "$SUBJECT" "$EMAIL" "$EMAILMESSAGE" 
fi 
+7

Fix la maladie, et non les symptômes. Vous devriez demander comment déterminer pourquoi Apache est suspendu (probablement dans ServerFault) et puis corriger cela ... pas comment le redémarrer quand il se bloque. – Juliano

+0

Pourquoi avez-vous réinventé la roue ici, les scripts de démarrage trouvés dans /etc/rc.d ou similaire (en fonction de l'installation unix/linux) ont la possibilité de redémarrer, mais encore une fois, consultez vos journaux d'erreurs pour savoir pourquoi avoir à redémarrer le serveur, habituellement/etc/rc.d/3/rc.httpd redémarrer ou similaire ... – t0mm13b

+1

Salut. Juliano tu as raison. Je suis à la recherche de la cause première du problème mais je pense que ce genre de scripts est un "must have" car il est possible qu'à l'avenir il se bloque et que ce script résout temporairement le problème. –

Répondre

29

Nous avions Apache segfaulting parfois sur une machine; Voici le script que nous avons utilisé en essayant de déboguer le problème tout en gardant Apache. Il a couru à partir de cron (en tant que root) une fois par minute environ. Cela devrait être explicite.

#!/bin/sh 
# Script that checks whether apache is still up, and if not: 
# - e-mail the last bit of log files 
# - kick some life back into it 
# -- Thomas, 20050606 

PATH=/bin:/usr/bin 
THEDIR=/tmp/apache-watchdog 
[email protected] 
mkdir -p $THEDIR 

if (wget --timeout=30 -q -P $THEDIR http://localhost/robots.txt) 
then 
    # we are up 
    touch ~/.apache-was-up 
else 
    # down! but if it was down already, don't keep spamming 
    if [[ -f ~/.apache-was-up ]] 
    then 
     # write a nice e-mail 
     echo -n "apache crashed at " > $THEDIR/mail 
     date >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     echo "Access log:" >> $THEDIR/mail 
     tail -n 30 /var/log/apache2_access/current >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     echo "Error log:" >> $THEDIR/mail 
     tail -n 30 /var/log/apache2_error/current >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     # kick apache 
     echo "Now kicking apache..." >> $THEDIR/mail 
     /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1 
     killall -9 apache2 >> $THEDIR/mail 2>&1 
     /etc/init.d/apache2 start >> $THEDIR/mail 2>&1 
     # send the mail 
     echo >> $THEDIR/mail 
     echo "Good luck troubleshooting!" >> $THEDIR/mail 
     mail -s "apache-watchdog: apache crashed" $EMAIL < $THEDIR/mail 
     rm ~/.apache-was-up 
    fi 
fi 

rm -rf $THEDIR 

Nous n'avons jamais comprendre le problème ...

+7

Ce 'rm -rf' me rend nerveux. Il semble que vous écrivez deux fichiers. Supprimez-les simplement explicitement puis 'rmdir $ THEDIR'. –

+0

Lequel est le meilleur pour tester le serveur apache, en utilisant wget ou vérifier le statut de l'apache en utilisant le statut /etc/init.d/httpd? Je pense que l'utilisation de wget mettra plus de stress sur le serveur. – geckob

+2

Je recommanderais certainement d'utiliser une requête http réelle, car si Apache bloque simplement des deadlocks ou quelque chose (c'est-à-dire que le processus est toujours en cours d'exécution), le script init ne vous le dira pas. Et si votre serveur ne peut pas gérer une requête par minute, un crash d'Apache est le moindre de vos soucis;) – Thomas

1

Vous pouvez essayer d'envoyer une requête http à apache (par exemple en utilisant wget --timeout=10) et si cette demande expire ou ne (état de sortie! = 0), vous tuer et redémarrez apache.

1

Pourquoi Apache se bloque-t-il? Pouvez-vous arriver à la cause?

Il existe un certain nombre de scripts et d'outils pour «démoniser» les applications et les surveiller. Comme vous semblez être sur Debian ou Ubuntu, regardez les paquets daemon et daemontools. Je suis sûr qu'il y en a d'autres aussi.

2

Le nombre de processus peut-il être inférieur à zéro?

Cela devrait être suffisant:

if ! pgrep apache2 -c >/dev/null; then 
+1

Je ne vois pas en quoi cela est pertinent, aussi vrai que cela puisse être. –

Questions connexes