Ich habe das Gefühl, dass ich das Offensichtliche übersehe, aber ich habe keinen Erfolg mit man [curl|wget]
oder Google ("http" ist ein so schlechter Suchbegriff). Ich bin auf der Suche nach einer schnellen Lösung für einen unserer Webserver, der häufig fehlschlägt und den Statuscode 500 mit einer Fehlermeldung zurückgibt. Sobald dies geschieht, muss er neu gestartet werden.
Da die Ursache schwer zu finden ist, suchen wir nach einer schnellen Lösung, in der Hoffnung, dass sie ausreicht, um die Zeit zu überbrücken, bis wir das Problem wirklich beheben können (der Dienst benötigt keine hohe Verfügbarkeit).
Die vorgeschlagene Lösung besteht darin, einen Cron-Job zu erstellen, der alle 5 Minuten läuft und http://localhost:8080/ überprüft. Wenn dieser mit dem Statuscode 500 zurückkommt, wird der Webserver neu gestartet. Der Server wird in weniger als einer Minute neu gestartet, so dass es nicht notwendig ist, nach bereits laufenden Neustarts zu suchen.
Bei dem fraglichen Server handelt es sich um eine Minimalinstallation von Ubuntu 8.04, auf der gerade genug Pakete installiert sind, um die aktuellen Anforderungen zu erfüllen. Es ist nicht zwingend erforderlich, die Aufgabe in der Bash zu erledigen, aber ich möchte, dass sie in einer solchen minimalen Umgebung läuft, ohne weitere Interpreter zu installieren.
(Ich bin hinreichend vertraut mit Skripten, dass die Befehle/Optionen, um den http-Statuscode einer Umgebungsvariablen zuzuweisen, ausreichen würden - danach habe ich gesucht und konnte nichts finden.)
Ich habe dies nicht mit einem 500er Code getestet, aber es funktioniert mit anderen wie 200, 302 und 404.
response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
Wie von @ibai vorgeschlagen, fügen Sie --head
hinzu, um nur eine HEAD-Anfrage zu stellen. Das spart Zeit, wenn der Abruf erfolgreich ist, da der Seiteninhalt nicht übertragen wird.
Obwohl die akzeptierte Antwort eine gute Antwort ist, übersieht sie Fehlerszenarien. curl
gibt 000
zurück, wenn es einen Fehler in der Anfrage oder einen Verbindungsfehler gibt.
``bash url='http://localhost:8080/' status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url}) [[ $status == 500 ]]] || [[ $status == 000 ]] && echo Neustart von ${url} # Start/Neustart-Logik ausführen
Anmerkung: dies geht ein wenig über die angeforderte `500` Statusprüfung hinaus, um auch zu bestätigen, dass `curl` sich überhaupt mit dem Server verbinden kann (d.h. `000` zurückgibt).
Erstellen Sie daraus eine Funktion:
```bash
failureCode() {
local url=${1:-http://localhost:8080}
local code=${2:-500}
local status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
[[ $status == ${code} ]] || [[ $status == 000 ]]]
}
Test, um eine "500" zu erhalten:
failureCode http://httpbin.org/status/500 && echo need to restart
Test erhält Fehler/Verbindungsfehler (d.h. 000
):
failureCode http://localhost:77777 && echo need to start
Test erhält keine 500
:
failureCode http://httpbin.org/status/400 || echo not a failure