Ich habe das Gefühl, dass mir das Offensichtliche fehlt, aber es ist mir mit man [curl|wget]
oder Google nicht gelungen ("http" macht einen so schlechten Suchbegriff). Ich suche nach einer schnellen und schmutzigen Lösung für einen unserer Webserver, die häufig ausfällt und den Statuscode 500 mit einer Fehlermeldung zurückgibt. Sobald dies geschieht, muss es neu gestartet werden.
Da die Hauptursache schwer zu finden zu sein scheint, streben wir eine schnelle Lösung an, in der Hoffnung, dass dies ausreicht, um die Zeit zu überbrücken, bis wir sie wirklich beheben können (der Service benötigt keine Hochverfügbarkeit).
Die vorgeschlagene Lösung besteht darin, einen Cron-Job zu erstellen, der alle 5 Minuten ausgeführt wird und http: // localhost: 8080 / überprüft . Wenn dies mit dem Statuscode 500 zurückgegeben wird, wird der Webserver neu gestartet. Der Server wird in weniger als einer Minute neu gestartet, sodass nicht nach bereits laufenden Neustarts gesucht werden muss.
Bei dem fraglichen Server handelt es sich um eine Ubuntu 8.04-Minimalinstallation mit gerade genug installierten Paketen, um das auszuführen, was derzeit benötigt wird. Es ist nicht unbedingt erforderlich, die Aufgabe in Bash auszuführen, aber ich möchte, dass sie in einer so minimalen Umgebung ausgeführt wird, ohne dass weitere Interpreter installiert werden.
(Ich bin mit Skripten hinreichend vertraut, sodass der Befehl / die Optionen zum Zuweisen des http-Statuscodes zu einer Umgebungsvariablen ausreichen würden - das habe ich gesucht und konnte es nicht finden.)
quelle
response=$(curl --write-out \\n%{http_code} --silent --output - servername)
- Die letzte Zeile im Ergebnis ist der Antwortcode.--insecure
.funktioniert. Wenn nicht, müssen Sie die Eingabetaste drücken, um den Code selbst anzuzeigen.
quelle
Ich musste heute schnell etwas vorführen und habe mir das ausgedacht. Ich dachte, ich würde es hier platzieren, wenn jemand etwas Ähnliches wie die Anfrage des OP benötigt.
Dies sendet eine E-Mail-Benachrichtigung bei jeder Statusänderung von 200, so dass es dumm und möglicherweise gierig ist. Um dies zu verbessern, würde ich versuchen, mehrere Statuscodes zu durchlaufen und je nach Ergebnis unterschiedliche Aktionen auszuführen.
quelle
Obwohl die akzeptierte Antwort eine gute Antwort ist, werden Fehlerszenarien übersehen.
curl
wird zurückgegeben,000
wenn ein Fehler in der Anforderung vorliegt oder ein Verbindungsfehler vorliegt.Hinweis: Dies geht ein wenig über die angeforderte
500
Statusprüfung hinaus, um auch zu bestätigen, dasscurl
sogar eine Verbindung zum Server hergestellt werden kann (dh zurückgegeben wird)000
).Erstellen Sie daraus eine Funktion:
Testen Sie ein
500
:Testfehler / Verbindungsfehler (dh
000
):Test nicht bekommen
500
:quelle
Mit netcat und awk können Sie die Serverantwort manuell verarbeiten:
quelle
So folgen Sie 3XX-Weiterleitungen und drucken Antwortcodes für alle Anforderungen:
quelle
grep
erfasst alle Zeilen mit "HTTP". Vielleicht,grep -m 1 HTTP
um nur das erste Match zu holen, wenn das die Absicht ist, oder stattdessen zu Awk zu leiten, um nur den Ergebniscode zu analysieren.Dies kann helfen, den http-Status zu bewerten
quelle
head -n 1 | awk '{stuff}'
ist ein bisschen wie ein Antimuster,awk 'NR==1 {stuff}'
macht dasselbe in einem Prozess, reines Awk.Eine andere Variante:
quelle
Hier kommt das langwierige und dennoch leicht verständliche Skript, das von der Lösung von Nicerobot inspiriert ist und nur die Antwortheader anfordert und die Verwendung von IFS wie hier vorgeschlagen vermeidet . Es gibt eine Bounce-Nachricht aus, wenn eine Antwort> = 400 auftritt. Dieses Echo kann durch ein Bounce-Skript ersetzt werden.
quelle
Ich mochte die Antworten hier nicht, die die Daten mit dem Status mischen. Folgendes gefunden: Sie fügen das Flag -f hinzu, damit die Locke fehlschlägt, und übernehmen den Fehlerstatuscode aus dem Standardstatus var: $?
/unix/204762/return-code-for-curl-used-in-a-command-substitution
Ich weiß nicht, ob es für jedes Szenario hier perfekt ist, aber es scheint meinen Bedürfnissen zu entsprechen und ich denke, es ist viel einfacher, damit zu arbeiten
quelle
Hier ist meine Implementierung, die etwas ausführlicher ist als einige der vorherigen Antworten
quelle
So fügen Sie @DennisWilliamson Kommentar oben hinzu:
Sie können dann den Antwortcode aus der Antwort wie folgt analysieren, wobei X einen regulären Ausdruck kennzeichnen kann, um das Ende der Antwort zu markieren (anhand eines json-Beispiels hier).
Siehe Entfernen von Teilzeichenfolgen: http://tldp.org/LDP/abs/html/string-manipulation.html
quelle
echo
, um den endgültigen Wert zu erhalten? Justcode=${response##*\}}
ist einfacher und vermeidet eine Reihe häufiger Fallstricke. Das ist auch ein Glob-Muster, kein richtiger regulärer Ausdruck.