2010-01-30 23 views
12

Ich habe ein Bash-Skript geschrieben, um Apache neu zu starten, wenn es gehängt wurde und E-Mails an den Administrator gesendet wurden. Der Code ist unten gezeigt. Der Code startet Apache neu, wenn die Anzahl der Apache-Prozesse Null ist. Das Problem ist: Apache einige Zeit hängt und Prozesse ist immer noch nicht Null, in diesem Fall wird das Skript Apache nicht neu starten. Die benötigte ist: Wie ändere ich den Code, um Apache neu zu starten, wenn es gehängt und die Prozesse nicht Null ist.bash script zum automatischen Neustart von Apache

#!/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

die Krankheit Fix, nicht die Symptome. Sie sollten sich fragen, wie Sie herausfinden können, warum Apache hängt (wahrscheinlich in ServerFault) und dann das beheben ... nicht, wie Sie es neu starten, wenn es hängt. – Juliano

+0

Warum haben Sie das Rad hier neu erfunden, die Startup-Skripte in/etc/rc.d oder ähnlich (je nach Unix/Linux-Installation) hat die Möglichkeit, einen Neustart durchzuführen, aber überprüfen Sie wiederum Ihre Fehlerprotokolle, warum Sie muss den Server neu starten, normalerweise /etc/rc.d/3/rc.httpd restart oder ähnliches ... – t0mm13b

+1

Hi. Juliano, du hast Recht. Ich bin auf der Suche nach der Ursache des Problems, aber ich denke, diese Art von Skripten ist ein "Muss", weil es in Zukunft wird es hängen bleiben und dieses Skript wird das Problem vorübergehend lösen. –

Antwort

29

Wir benutzten Apache Speicherzugriffsfehler haben, manchmal auf einer Maschine; Hier ist das Skript, das wir benutzt haben, um das Problem zu beheben, während Apache aufrecht gehalten wird. Es lief von cron (als root) einmal jede Minute oder so. Es sollte selbsterklärend sein.

#!/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 

Wir haben nie das Problem herauszufinden ...

+7

Das 'rm -rf' macht mich nervös. Es sieht so aus, als ob du zwei Dateien schreibst. Löschen Sie sie nur explizit dann 'rmdir $ THEDIR'. –

+0

Welche ist besser, den Apache-Server zu testen, mit wget oder überprüfen Sie den Status des Apache mit /etc/init.d/httpd Status? Ich denke, mit wget wird mehr Stress auf den Server. – geckob

+2

Ich würde sicherlich eine tatsächliche HTTP-Anfrage empfehlen, denn wenn Apache nur Deadlocks oder etwas hängt (d. H. Der Prozess läuft noch), wird das Init-Skript Ihnen nicht sagen. Und wenn Ihr Server nicht eine Anfrage pro Minute verarbeiten kann, ist ein Absturz Apache der kleinste Ihrer Sorgen;) – Thomas

1

könnten Sie versuchen, eine HTTP-Anfrage zu senden, um Apache (z wget --timeout=10 verwendet wird) und wenn durch diese Anfrage Zeiten oder fehlschlägt (Exit-Status! = 0), Sie töten und Apache neu starten.

1

Warum würde Apache hängen? Kannst du zu der Ursache kommen?

Es gibt eine Reihe von Skripten und Tools, um Apps zu "dämonisieren" und sie zu überwachen. Wie Sie auf Debian oder Ubuntu zu sein scheinen, werfen Sie einen Blick auf die Pakete daemon und daemontools. Ich bin mir sicher, dass es auch andere gibt.

2

Kann die Zählung eines Prozesses wirklich kleiner als Null sein?

Dies sollte ausreichend sein:

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

Ich sehe nicht, wie das relevant ist, wie wahr es auch sein mag. –