Frage Skript, um automatisch zu testen, ob eine Website verfügbar ist


Ich bin ein einsamer Webentwickler mit meinem eigenen Centos VPS, der ein paar kleine Websites für meine Kunden hostet. Heute habe ich festgestellt, dass mein httpd-Dienst gestoppt wurde (ohne ersichtlichen Grund - aber das ist ein anderer Thread). Ich habe es neu gestartet, aber jetzt muss ich einen Weg finden, dass ich per E-Mail und / oder SMS benachrichtigt werden kann, wenn es wieder passiert - ich mag es nicht, wenn mein Klient mich anruft, um mir zu sagen, dass ihre Website nicht funktioniert!

Ich weiß, dass es wahrscheinlich viele verschiedene Möglichkeiten gibt, einschließlich Server-Monitoring-Software. Ich denke, alles, was ich wirklich brauche, ist ein Skript, das ich als Cron-Job von meinem Dev-Host ausführen kann (der permanent in meinem Büro läuft), der versucht, eine Seite von meinem Produktionsserver zu laden und wenn nicht innerhalb von 30 geladen wird Sekunden dann sendet es mir eine Email oder SMS. Ich bin ziemlich dumm beim Shell-Scripting, daher diese Frage.

Irgendwelche Vorschläge würden dankbar geschätzt.


18
2018-06-20 14:37


Ursprung


Hast du nach Nagios oder Pingdom geschaut? Sie haben diese Funktionalität eingebaut (Nun, Pingdom hat SMS eingebaut, mit Nagios braucht es etwas Tweeking, aber es ist möglich) - Smudge
Nein, ich werde jetzt einen Blick darauf werfen, danke für den Rat. - Xoundboy


Antworten:


Nun ... Das einfachste Skript, ich cam schreiben:

/usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || echo "The site is down" | /usr/bin/mail -v -s "Site is down" your@e-mail.address

Fügen Sie es zu Cron hinzu als:

* * * * * /usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null  | grep "Normal operation string" || echo "The site is down" | /usr/bin/mail -v -s "Site is down" your@e-mail.address

Aber es ist zu einfach, Ihnen zu sagen, was das Problem ist, wenn es existiert.

UPD: Jetzt sucht dieser Einzeiler nach einer bestimmten Zeichenkette auf der Seite ("Normal operation string"), die nur bei normalem Betrieb erscheinen soll.

UPD2: Eine einfache Möglichkeit, die Fehlerseite in der E-Mail zu senden:

/usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || /usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | /usr/bin/mail -v -s "Site is down" your@e-mail.address

Es ist Minus, dass die Seite im Falle eines ersten Testversagens erneut angefordert wird. Diesmal kann die Anfrage erfolgreich sein und Sie werden den Fehler nicht sehen. Natürlich ist es möglich, die Ausgabe zu speichern und als Anhang zu versenden, aber das Skript wird dadurch komplexer.


12
2018-06-20 15:00



Sieht interessant aus ... wenn also die Seite nicht innerhalb von 30 Sekunden geladen wird, wird eine E-Mail gesendet oder? Was passiert, wenn die Seite geladen wird, aber eine Fehlermeldung angezeigt wird - wie kann dies angepasst werden, um nach einer bestimmten Ausgabe zu suchen? - Xoundboy
Die Antwort wurde aktualisiert. Aber das Skript sendet Ihnen immer noch keinen Fehler. - HUB
- Hallo, danke für das Update - ich habe Probleme damit, das auf meinem Rechner zum laufen zu bringen - ich glaube nicht, dass der Mail-Teil des Befehls seine Sache richtig macht - ich habe jetzt keine Zeit mehr zur Fehlersuche, werde es aber versuchen wieder morgen oder so schnell wie möglich. - Xoundboy
Nun ... Versuchen Sie, das Mailprogramm manuell auszuführen und überprüfen Sie die Ausgabe. Siehe auch "/ var / log / mail" für Ergebnisse Überprüfen Sie die Firewall-Einstellungen (Zugriff auf Remote-Port 25 sollte erlaubt sein). - HUB


Schau dir dieses Skript an:

curl ist ein Befehlszeilendienstprogramm zum Abrufen einer URL. Das Skript prüft den Exit-Code ($? Bezieht sich auf den Exit-Code des letzten Befehls in einem Shell-Skript) und meldet einen Fehler (wenn ein Exit-Code 0 ist, bezieht sich der Exit-Code auf Erfolg). Wie in der Antwort von HUB erwähnt, können Sie auch einfach || in der Befehlszeile, um einen zweiten Befehl auszuführen, wenn der erste fehlschlägt.

Sobald Sie den Status herausgefunden haben, müssen Sie sich nur noch eine Mail schicken. Hier ist ein Beispiel, das die verwendet mail Befehl zum Senden von E-Mail von einem Shell-Skript, vorausgesetzt, die Box, von der aus Sie testen, hat SMTP-Setup:

Übrigens: Wenn Sie Shell-Skripte nicht gut beherrschen, beschränken Sie sich nicht auf ein Shell-Skript. Sie könnten ein Ruby-Skript, ein PHP-Skript, jede Art von Skript verwenden, das Ihr Server ausführen kann! Fügen Sie einfach die hinzu #!/path/to/executable Zeile am Anfang des Skripts - zum Beispiel:

#!/usr/bin/php


8
2018-06-20 15:30



Danke für Ihre Hilfe. Ich werde diese Lösung prüfen, sobald ich einen Moment habe. Wird sich bald melden. - Xoundboy


Ich weiß, dass alle oben genannten Skripte genau das sind, was Sie gefragt haben, aber ich würde vorschlagen, monit zu betrachten, da es Ihnen eine E-Mail schicken wird, wenn apache heruntergefahren ist, aber es auch neu startet (wenn es unten ist).


2
2018-06-20 15:43



Das sieht auch interessant aus - ich werde versuchen, Zeit zu finden, um es bald zu überprüfen und meine Ergebnisse zurückzuverfolgen. - Xoundboy


Prüfen Dieses Skript. es überprüft eine Liste von Websites und sendet E-Mails (zur Liste der E-Mails), wenn etwas nicht stimmt (HTTP-Antwort unterscheidet sich von 200). Das Skript erstellt eine .temp-Datei, um sich zu erinnern, welche Website (s) bei der letzten Überprüfung fehlgeschlagen ist, so dass Sie nicht mehrere E-Mails erhalten. Die .temp-Datei wird gelöscht, wenn die Website wieder funktioniert.

#!/bin/bash
# list of websites. each website in new line. leave an empty line in the end.
LISTFILE=/scripts/isOnline/websites.lst
# Send mail in case of failure to. leave an empty line in the end.
EMAILLISTFILE=/scripts/isOnline/emails.lst

# `Quiet` is true when in crontab; show output when it's run manually from shell.
# Set THIS_IS_CRON=1 in the beginning of your crontab -e.
# else you will get the output to your email every time
if [ -n "$THIS_IS_CRON" ]; then QUIET=true; else QUIET=false; fi

function test {
  response=$(curl --write-out %{http_code} --silent --output /dev/null $1)
  filename=$( echo $1 | cut -f1 -d"/" )
  if [ "$QUIET" = false ] ; then echo -n "$p "; fi

  if [ $response -eq 200 ] ; then
    # website working
    if [ "$QUIET" = false ] ; then
      echo -n "$response "; echo -e "\e[32m[ok]\e[0m"
    fi
    # remove .temp file if exist.
    if [ -f cache/$filename ]; then rm -f cache/$filename; fi
  else
    # website down
    if [ "$QUIET" = false ] ; then echo -n "$response "; echo -e "\e[31m[DOWN]\e[0m"; fi
    if [ ! -f cache/$filename ]; then
        while read e; do
            # using mailx command
            echo "$p WEBSITE DOWN" | mailx -s "$1 WEBSITE DOWN" $e
            # using mail command
            #mail -s "$p WEBSITE DOWN" "$EMAIL"
        done < $EMAILLISTFILE
        echo > cache/$filename
    fi
  fi
}

# main loop
while read p; do
  test $p
done < $LISTFILE

Fügen Sie die folgenden Zeilen zu crontab config hinzu ($ crontab -e)

THIS_IS_CRON=1
*/30 * * * * /path/to/isOnline/checker.sh

Verfügbar auf Github


2
2017-08-09 15:01





Ich würde Pingdom dafür empfehlen. Ihr kostenloser Dienst ermöglicht es Ihnen, 1 Website zu überprüfen, aber das ist alles, was Sie brauchen, um 1 Server zu überprüfen. Wenn Sie ein iPhone haben, senden Sie ihnen Push-Nachrichten kostenlos, also brauchen Sie keine SMS-Gutschriften von ihnen zu kaufen, und sie haben mehrere Einstellungen, die Sie verwenden können. Meine ist so eingestellt, dass sie mich nach 2 Wiederholungen (10 Minuten) und danach alle 10 Minuten benachrichtigt. Es ist großartig, da es auch nach HTTP 500-Nachrichten sucht, die anzeigen, dass eine Site nicht verfügbar ist. Wenn es fehlschlägt, überprüft es Ihre Site sofort erneut von einem anderen Server an einem anderen Speicherort. Wenn das hier fehlschlägt, dann löst das aus, wie und wann Sie benachrichtigt werden möchten.


1
2018-06-20 14:55



Ich mag diesen Pingdom-Service wirklich - ich habe einfach das kostenlose Konto eingerichtet und den Scheck und die SMS an meine tschechische Handynummer getestet - beides funktioniert - werde das vorerst ausprobieren und sehen, wie es geht. - Xoundboy
Leider scheint Pingdom nicht mehr die kostenlose Stufe anzubieten. Der günstigste Plan ist 14,95 $ / Monat. - Ben Johnson


Da Sie viele Websites auf Ihrem VPS haben, würde ich empfehlen, dass Sie ein Konto mit Website-Überwachungswebsite wie host-tracker.com eröffnen können. Abgesehen davon, dass Sie benachrichtigt werden, wenn die Site down ist oder nicht, bieten sie Ihnen auch wöchentliche, monatliche und jährliche Uptime Ihrer Standorte. Wish ist sehr hilfreich für Management und Leistung.


0
2018-06-21 06:53





Wie wäre es damit:

#!/bin/bash
/etc/init.d/httpd status
if [[ $? == 3 ]]; then
   echo "Httpd is down `date`" | mail support@example.com
   exit 1
fi
exit 0

0
2018-06-21 06:58



Ich mag die Einfachheit, aber das wird nicht testen, ob die Website über das Internet verfügbar ist. Der Dienst könnte zwar ausgeführt werden, aber keine Clients. Ich bin darauf schon einmal hereingefallen. - John Gardeniers
Vereinbart, obwohl, wenn Sie sicherstellen möchten, dass es aus dem Internet zugänglich ist, müssten Sie es über das Internet testen. Selbst das Ausführen von wget auf dem Server zu seiner externen Netzwerkschnittstelle wäre kein genauer Test, auf den das Internet zugreifen könnte. - frogstarr78


Geringe Variation des Obigen.

Ein Skript, um zu überprüfen, ob eine Website alle 10 Sekunden verfügbar ist. Melden Sie fehlgeschlagene Versuche in ein siteuptime.txt Datei, so dass es später angesehen werden kann (oder in Excel grafisch dargestellt werden kann).

#!/bin/bash
# Check site every 10 seconds, log failed connection attempts in siteuptime.txt
while true; do
echo "Checking site...";
/usr/bin/wget "http://www.mysite" --timeout 6 -O - 2>/dev/null | grep "My String On page" || echo "The site is down" | date --iso-8601=seconds >> siteuptime.txt;
sleep 10;
done;

0
2018-04-12 00:25