Gesundheitscheck der Webseite unter Verwendung der Wellung

34

Ich möchte einen Gesundheitscheck eines Dienstes durchführen, indem ich eine bestimmte URL aufrufe. Die einfachste Lösung wäre die Verwendung von cron, um die Prüfung etwa jede Minute durchzuführen. Im Fehlerfall sendet mir cron eine E-Mail.

Ich habe versucht, cUrl dafür zu verwenden, aber ich kann es nicht dazu bringen, Meldungen nur bei Fehlern auszugeben. Wenn ich versuche, die Ausgabe nach / dev / null zu leiten, wird der Fortschrittsbericht gedruckt.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5559  100  5559    0     0   100k      0 --:--:-- --:--:-- --:--:--  106k

Ich habe versucht, die Curl-Optionen durchzusehen, aber ich kann nichts finden, das der Situation entspricht, in der Sie möchten, dass es über den Erfolg schweigt, aber bei Fehlern Geräusche macht.

Gibt es eine Möglichkeit, Curl zu machen, was ich will, oder gibt es ein anderes Tool, das ich mir ansehen sollte?

palto
quelle
2
Wie wäre es mit der Verwendung icingaoder einem anderen Überwachungssystem?
Stéphane Chazelas
Ich verwende dies in einem Hobbyprojekt mit begrenzten Ressourcen auf einem gemeinsam genutzten Host. Ansonsten würde ich gerne ein Überwachungssystem verwenden. Trotzdem vielen Dank für den Tipp, ich hatte noch nie von Icinga gehört
palto
Ich möchte darauf hinweisen, dass Share-Hosting-Anbieter dies missbilligen, wenn Sie zu häufig auf alle Seiten Ihres Kontos zugreifen. Anbieter haben in der Regel gleichzeitige Prozessbeschränkungen und maximale Ausführungszeitbeschränkungen. Diese Methode ist auch dann nicht korrekt, wenn zwischen Ihnen und dem DC des Anbieters ein Netzwerkausfall vorliegt. Sie sollten die Domänenzugriffsprotokolle in Ihrem freigegebenen Konto untersuchen. Typischerweise gibt es viel Verkehr von Bots und nur zufälligen Besuchern, die Ihnen eine sehr gute Vorstellung davon geben, wie verfügbar Ihre Website ist.
rcjohnson

Antworten:

39

Was ist -sSf? Aus den Manpages:

  -s/--silent
     Silent or quiet mode. Do not show progress meter or error messages.  
     Makes Curl mute.

  -S/--show-error
     When used with -s it makes curl show an error message if it fails.

  -f/--fail
     (HTTP)  Fail silently (no output at all) on server errors. This is mostly
     done to better enable scripts etc to better deal with failed attempts. In
     normal  cases  when a HTTP server fails to deliver a document, it returns
     an HTML document stating so (which often also describes  why  and  more).
     This flag will prevent curl from outputting that and return error 22.

     This method is not fail-safe and there are occasions where non-successful
     response codes will  slip  through,  especially  when  authentication  is
     involved (response codes 401 and 407).

Beispielsweise:

curl -sSf http://example.org > /dev/null
ahilsend
quelle
3
-sS hat die Fehlermeldung aus irgendeinem Grund nicht ausgegeben. Ich musste auch -f hinzufügen. Der richtige Arbeitsbefehl scheint zu sein curl -fsS http://example.org > /dev/null. Das wird nichts ausgeben, wenn nichts falsch ist, aber es wird den Statuscode auf Fehler drucken, was für mich in Ordnung ist.
Palto
1
Ok, -ffür zukünftige Referenzen hinzugefügt .
Ahilsend
10

Ich denke, dass Sie für den einfachsten Weg, um zu überprüfen, ob die Site aktiv ist, die folgende Methode verwenden können:

curl -Is http://www.google.com | head -n 1

Dies wird zurückkehren HTTP/1.1 200 OK. Wenn die Rückgabe nicht mit Ihrer Ausgabe übereinstimmt, rufen Sie um Hilfe.

Raza
quelle
1
Das Überprüfen des Statuscodes ist wahrscheinlich sinnvoller als bei den anderen Vorschlägen
Dukeatcoding
Ich erhalte "HTTP / 1.1 302 Found".
Schwammgenosse
1
Dies ist großartig, da es über einen Ping hinausgeht und es mir ermöglicht, zu überprüfen, ob meine Site korrekt geladen wird (Verbindung zu mySQL usw.) und aussagekräftigere Ergebnisse zu erzielen.
Nathan
8

Sie benötigen das -sFlag (Silent), -fFlag (Fail mit Exit-Code bei Fehler) und können das -oFlag verwenden, um die Ausgabe umzuleiten:

curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" [email protected] 

Dies ist nur ein schlechtes Beispiel für ein einfaches Cron-Skript. Normalerweise möchten Sie nur eine E-Mail erhalten, wenn eine Website nicht verfügbar ist.

Jofel
quelle
8

Sie können die Netzwerk-Timing-Statistiken von Curl erfassen. Latenzen für jede Phase in einem Anforderungs- / Antwortzyklus können hilfreich sein, um den Zustand zu bestimmen.

$ URL=https://example.com
$ curl "$URL" -s -o /dev/null -w \
> "response_code: %{http_code}\n
> dns_time: %{time_namelookup}
> connect_time: %{time_connect}
> pretransfer_time: %{time_pretransfer}
> starttransfer_time: %{time_starttransfer}
> total_time: %{time_total}
> "
response_code: 200

dns_time: 0.029
connect_time: 0.046
pretransfer_time: 0.203
starttransfer_time: 0.212
total_time: 0.212
Corey Goldberg
quelle
2

Auf diese Weise können Sie die Site testen, wenn https vorhanden ist:

#!/bin/bash
# put your domain in this var
https=https://www.somewebsite.com

# save the status in some variable 
status=`curl $https -k -s -f -o /dev/null && echo "SUCCESS" || echo "ERROR"`    

# print results (or use it in your scripts)
echo "testing $https=$status"
Christian
quelle
1

Ich wurde kürzlich gebeten, mir etwas auszudenken, das eher wie ein ausgefeilter Herzschlag wirken würde.

for i in `curl -s -L cnn.com |egrep --only-matching "http(s?):\/\/[^ \"\(\)\<\>]*" | uniq` ; do curl -s -I $i 2>/dev/null |head -n 1 | cut -d$' ' -f2; done

Oder erweitert für ein wenig mehr Lesbarkeit,

for i in $(curl -s -L cnn.com |egrep --only-matching 'http(s?):\/\/[^ \"\(\)\<\>]*' | uniq)
do
    curl -s -I "$i" 2>/dev/null | head -n 1 | cut -d' ' -f2
done

Was ich getan habe, war curleine Website, die alle Links aus dem HTML- curlCode und dann die analysierten Links auswertet und nur den Statuscode ausgibt. Dann würde ich nach http-Statuscodes> = 400 suchen, um Fehler zu finden.

elee
quelle
1

Antworten:

#!/bin/bash -eu
timeout 3s curl -fIsS http://example.org > /dev/null
# and if you have TLS (https), check if it's about to expire:
true | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -checkend "$((3600*24*20))"

Erklärungen:

  • timeout 3slegt eine Zeitüberschreitung von 3 Sekunden für Ihre Anfrage fest. Langsamer antworten gilt als "nicht gesund"
  • Das Curl- -fFlag schlägt vorzeitig fehl, -Szeigt Fehler an, -sunterdrückt die normale Ausgabe und -Iruft nur HTTP-Header ab, nicht den Inhalt. (Wie immer sind weitere Details auf man curlBefehl verfügbar .)
  • Die openssl- -checkendDirektive überprüft das Ablaufdatum für ein Zertifikat. In meinem Beispiel sind es 20 Tage (in Sekunden angegeben).
VasyaNovikov
quelle
Ich denke du hast die Erklärungen von -sund -Sgetauscht
nafg 20.04.17
1

Curl hat sehr spezifische Exit-Statuscodes.
Warum nicht einfach nach diesen suchen?

#!/bin/bash

##name: site-status.sh

FAIL_CODE=6

check_status(){
    LRED="\033[1;31m" # Light Red
    LGREEN="\033[1;32m" # Light Green
    NC='\033[0m' # No Color


    curl -sf "${1}" > /dev/null

    if [ ! $? = ${FAIL_CODE} ];then
        echo -e "${LGREEN}${1} is online${NC}"
    else
        echo -e "${LRED}${1} is down${NC}"
    fi
}


check_status "${1}"

Verwendung:

$ site-status.sh example.com

Ergebnis:

$ example.com is online

Anmerkungen:

Dieses Skript überprüft nur, ob die Site aufgelöst werden kann.

Mit diesem Code sollten Sie zurechtkommen, wenn Sie sich nur dafür interessieren, ob die Site aktiv oder inaktiv ist.
Wenn Sie jedoch einige Änderungen am if / else-Block vornehmen, können Sie auf Wunsch problemlos nach anderen Statuscodes suchen

Silvernode
quelle