PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Apache überwachen und ggf. neustarten



SUMAS
23.02.09, 07:17
Hallo, ich hab auf meinem Server grad ein Speicher-Problem und mein Apache beendet sich dadurch ständig. Eh ich aber die Ursache gefunden habe bzw. meine Projekte optimiert habe, brauch ich ein Cronjob bzw. ein Skript was als Dienst läuft, und prüft ob der Apache gestoppt wurden ist, und wenn ja soll dieser erstmal wieder neu gestartet werden!

Kann mir da jemand helfen wie so ein Script aussehen muss?

Ps. ich möchte bitte jetzt nur antworten zu dem script. das speicher-problem werd ich vielleicht in einem neuenm Thread erörtern...

1000 Danke

marce
23.02.09, 07:51
ich würde eine Endlosschleife verwenden (while), per wget eine Seite vom Apache abrufen, das Ergebnis von wget (Returncode oder Inhalt des Abrufs) überprüfen und ggf. den Apache neu starten. Dann eine Minute warten (sleep) und alles geht von vorne los...

SUMAS
23.02.09, 08:22
ja, so hab ich mir das auch gedacht! bloß was meinst du mit eine seite von Apache aufrufen?

Skript müsste dann im Gerüst so aussehen, oder? (kannst ja gern ergänzen ;O))



#!/bin/bash

while [ true ]
do


sleep 5;
done

marce
23.02.09, 08:25
bloß was meinst du mit eine seite von Apache aufrufen?
auf dem Apache sind doch sicher irgendwelche Daten hinterlegt, die man per Web-Zugriff abrufen kann, oder? (Wäre ja auch der Sinn einer solchen Kiste...)

Wenn da also Daten sind - kann man sie abrufen. Dazu nimmt man meist eine URL. Und, erstaunlicherweise kann man Gerüchten zu Folge eine solche URL auch z.B. wget übergeben.

Der Abruf funktioniert dann (wäre toll, oder?) oder eben nicht. Und wenn nicht - dann willst Du wohl, wenn ich Dich richtig verstanden habe, den Apache neu starten.

Sam Fisher
23.02.09, 08:29
Hallo !
@marce: Würde nicht auch einfach ein /etc/init.d/apache2 start jede Minute reichen? Denn wenn er eh schon läuft bekommt man ja einfach nur

httpd (pid 3083) already running
Oder irre ich mich da?
Viele Grüße
Sam

marce
23.02.09, 08:33
Vermutlich nicht - da wird ja meist nur überprüft, ob das PID-File existiert. Und wenn der Server einfach abschmiert oder nicht mehr reagiert - ist das PID-File ja immer noch existent, auch wenn der Server keine Daten mehr ausliefert. Ähnliche sieht's oft bei Prozess-Überprüfungen oder open-Ports aus.

Ist übrigens ein recht interessantes Gebiet - Application-Monitoring und entsprechende Reaktionsmaßnahmen. Da kann man jede Menge Hirnschmalz reinstecken, um entsprechende Szenarien zu entwickeln (weil auch z.B. ein erfolgreiches wget nicht ausreichend sein kann - wenn z.B. ein 500er zurückkommt ist AFAIK aus Sicht von wget der Abruf erfolgreich gewesen - der Server aber sicherlich nicht zum Produktivbetrieb geeignet...)

Noch lustiger wird's, wenn man komplexe Klickstreams überprüfen muss, um Fehler zu finden (z.B. eben bei Speicherproblemen, Session-Handling, ...)

SUMAS
23.02.09, 08:44
@marce: hättest du gesagt seite vom server, hätte ich dich gleich verstanden ;O)
ich hab mal bissl nach wget gegoogelt, allerdings hab ich nix gefunden wie ich das ergebnis in eine variable speicher um es dann mit einer if-anweisung zu vergleichen. Seh immer nur was von ergebnis temporär in einer datei speichern. kann man das ergebnis auch in einer variable speichern?

marce
23.02.09, 08:51
warum willst Du es denn in einer Variable haben? Datei ist doch viel flexibler...

Du kannst aber doch die Abrufergebnisse von wget nach stdout ausgeben lassen - dann landet es problemlos in einer Variable oder evtl. sogar in einer Pipe. Alternativ mal curl ansehen, da muss man sich fast schon dagegen wehren, es nicht an stdout zu bekommen...

Oder schau dir mal die Nagios-Plugins an - das ist für sowas fast eine rundumglücklich-Lösung...

Je nach Art und Weise, wie der Apache abstürzt brauchst Du das auch gar nicht - da reicht evtl. auch nur der Returncode...

SUMAS
23.02.09, 10:37
#!/bin/bash

while [ true ]
do
RESULT="$(/usr/bin/curl http://www.meinedomain.com/system/sysrun.htm)";

if test "$RESULT" = "server is running" ;
then
echo 'Webserver is running';
else
echo 'Restarting Webserver';
rcapache2 start
fi

sleep 10;
done


so sieht mein skript aus...funktioniert auch soweit...verbesserungsvorschläge?

danke

marce
23.02.09, 10:43
anstatt start restart?

SUMAS
23.02.09, 10:51
wieso restart? der apache läuft ja nicht mehr...also sollte start vollkommen ausreichen!

marce
23.02.09, 10:57
Läuft er 100% nicht mehr? Keine PID-Files mehr übrig, keine hängenden Prozesse, die evtl. noch Port 80 belegen?

SUMAS
23.02.09, 12:51
naja, gut...habs auch restart geändert!

BedriddenTech
23.02.09, 17:52
#!/bin/sh
while [ 1 ]
do
pgrep httpd || rcapache2 restart
sleep $((5 * 60))
done

HTH.

marce
23.02.09, 18:06
löst aber nicht das Problem eines nicht mehr reagierenden Apache, dessen Prozesse aber noch laufen.

BedriddenTech
24.02.09, 00:04
Hast Recht.
Mist, jetzt hatte ich mal gehofft, ein eleganteres Skript hier reinstellen zu können...! :rolleyes: