Bash-Skript zum Erkennen, ob mein Server inaktiv oder offline ist


17

Hintergrund: Ich muss benachrichtigt werden, wenn mein Server ausfällt. Wenn der Server ausfällt, kann der Sysload-Collector möglicherweise keine Warnung senden. Um eine Warnung zu erhalten, wenn der Server nicht verfügbar ist, muss eine externe Quelle (Server) diese erkennen.

Frage: Gibt es eine Möglichkeit (ich bevorzuge Bash-Skript) zu erkennen, wenn mein Server ausgefallen oder offline ist und eine Warnmeldung (E-Mail + SMS) sendet?

Antworten:


24

Wenn Sie einen separaten Server haben, auf dem Ihr Überprüfungsskript ausgeführt werden soll, führt so etwas einen einfachen Ping-Test durch, um festzustellen, ob der Server aktiv ist:

#!/bin/bash
SERVERIP=192.168.2.3
NOTIFYEMAIL=test@example.com

ping -c 3 $SERVERIP > /dev/null 2>&1
if [ $? -ne 0 ]
then
   # Use your favorite mailer here:
   mailx -s "Server $SERVERIP is down" -t "$NOTIFYEMAIL" < /dev/null 
fi

Sie können das Skript so konfigurieren, dass es regelmäßig ausgeführt wird.

Wenn Sie nicht über mailx verfügen, müssen Sie diese Zeile durch das von Ihnen verwendete Befehlszeilen-E-Mail-Programm ersetzen und möglicherweise die Optionen ändern. Wenn Ihr Mobilfunkanbieter eine SMS-E-Mail-Adresse bereitstellt, können Sie die E-Mail an diese Adresse senden. Wenn Sie beispielsweise bei AT & T eine E-Mail an die Telefonnummer @ txt.att.net senden, wird die E-Mail an Ihr Telefon gesendet.

Hier ist eine Liste von E-Mail an SMS-Gateways:

http://en.wikipedia.org/wiki/List_of_SMS_gateways

Wenn Ihr Server eine öffentlich zugängliche Webserver ist, gibt es einige kostenlose Dienste Ihrer Website zu überwachen und Sie benachrichtigen , wenn es nach unten, das Web für die Überwachung kostenlose Website einige zu finden.


Können Sie Einzelheiten zu SMS-Warnmeldungen machen?
Md Mahbubur Rahman

4
Anstatt den Server zu pingen, sollten Sie testen, was immer Sie am Server interessiert. Wenn es sich beispielsweise um einen Mail-Server handelt, ist es viel wichtiger, dass E-Mails erfolgreich gesendet und empfangen werden.
Jim Paris

In meiner Antwort habe ich mich von der Anwendungserkennung ferngehalten, da in der Frage nicht angegeben war, welche Dienste auf dem Server ausgeführt werden. Er hat nach einer Server-Auf- / Ab-Erkennung gefragt. Es gibt Hunderte von allgemeinen Diensten, die erkannt werden könnten, und eine unbegrenzte Anzahl von benutzerdefinierten Anwendungen. Es klingt so, als hätte er einen lokalen Dienstmonitor (Sysload), der die Dienste überwacht.
Johnny

Ping ist für mich alles andere als nutzlos. Ich habe einen Server ausgefallen, erhalte jedoch 3 von 3 zurückgegebenen Paketen und einen endgültigen Rückgabewert von 0. Wie kommt es? Der lokale Computer gibt "Zielhost nicht erreichbar" -Pakete zurück.
AlastairG

@AlastairG - dies sollte besser als Frage gestellt werden, da in einem Kommentar nicht genügend Platz ist, um darauf zu antworten. Aber durchsuchen Sie zuerst die Website, um festzustellen, ob jemand eine ähnliche Frage gestellt hat. Möglicherweise finden Sie dort Ihre Antwort.
Johnny

9

Ping ist eine Option, aber in vielen Fällen kann ein Computer eine Ping-Antwort senden, während der eigentliche Server, um den es geht, nicht verfügbar ist. Es ist besser, einen End-to-End-Test durchzuführen. Im folgenden Beispiel wird eine Seite vom Webserver angefordert.

Wenn es sich um einen Webserver handelt, würde er ungefähr so ​​aussehen:

#!/bin/bash
wget -qO /dev/null 'http://webserver/some_existing_short_document.html' || {
    echo "Webserver down"
    # another mailer example
    sendemail -s mailserverip -f 'from@localhost' -t 'user@localhost' -u 'Webserver down' -m 'The webserver is down'
}

Wenn Sie das HTML-Dokument in ein PHP-Dokument umwandeln und PHP-Skripte wie Datenbankverbindungen, Dateisysteme usw. testen, können Sie sogar weitere Aspekte des Servers testen. Auf diese Weise können Sie eine proaktive Überwachung des Computers starten (siehe Probleme, bevor der Server abstürzt).

Ähnlich wie beim Überprüfen eines Mailservers, aber anstatt eine Webseite anzufordern, senden Sie einfach eine E-Mail über den Mailserver und prüfen, ob Sie diese in Ihrer Mailbox erhalten


wenn Sie root - E - Mails weitergeleitet Ihrem Posteingang erhalten, müssen Sie nicht sendmail , wenn Sie dieses Skript in der crontab ausführen (weil es die stdout senden Ihnen)
pscheit

5

Hier ist, wie ich das gleiche Problem gelöst habe

#!/bin/bash
NOTIFYEMAIL=<your email>
SMSEMAIL=<cell phone number @ sms-gateway>
SENDEREMAIL=alert@localhost
SERVER=http://127.0.0.1/
PAUSE=60
FAILED=0
DEBUG=0

while true 
do
/usr/bin/curl -sSf $SERVER > /dev/null 2>&1
CS=$?
# For debugging purposes
if [ $DEBUG -eq 1 ]
then
    echo "STATUS = $CS"
    echo "FAILED = $FAILED"
    if [ $CS -ne 0 ]
    then
        echo "$SERVER is down"

    elif [ $CS -eq 0 ]
    then
        echo "$SERVER is up"
    fi
fi

# If the server is down and no alert is sent - alert
if [ $CS -ne 0 ] && [ $FAILED -eq 0 ]
then
    FAILED=1
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER failed"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$SMSEMAIL" 
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$NOTIFYEMAIL" 
    fi

# If the server is back up and no alert is sent - alert
elif [ $CS -eq 0 ] && [ $FAILED -eq 1 ]
then
    FAILED=0
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER is back up"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$SMSEMAIL"
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$NOTIFYEMAIL"
    fi
fi
sleep $PAUSE
done

Ich musste mich anpassen, um auf meinem Mac zu laufen /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL

Diese Lösung funktioniert sicher ABER. (1) Wenn Sie dies auf dem lokalen Computer aufrufen, wird es Ihnen wahrscheinlich sagen, dass Apache gestorben ist, obwohl ich es nicht auf diese Weise tun würde. (2) Wenn Sie dies auf dem lokalen Computer verwenden und das Netzwerk ausgefallen ist oder etwas zwischen dieser Box und dem Edge-Server oder etwas anderem, erhalten Sie die E-Mail nicht und wissen nicht, dass ein Problem vorliegt. (3) Wenn Sie dies auf einem anderen Computer verwenden, dauert Ihr Befehl curl eine LANGE Zeit bis zur Zeitüberschreitung, sofern nicht anders angegeben. Wenn Sie also mehrere Hosts betrachten, kommt es zum Stillstand.
Mike Q

1

Ich kann die Verwendung von Nagios nur empfehlen , da es sich um eine Infrastruktur für die Überwachung und Benachrichtigung aller gewünschten Dienste handelt (viele Plugins sind verfügbar und Sie können Ihre eigenen schreiben). Es können natürlich einfache Pings durchgeführt werden, um die Verfügbarkeit von Servern zu überprüfen, aber wie andere darauf hingewiesen haben, ist es besser, stattdessen die Verfügbarkeit von Diensten (z. B. Web, E-Mail usw.) zu überprüfen (was Nagios problemlos tun kann).


Es ist ein cooles Produkt, ich frage mich über Sicherheitsbedenken
Mike Q
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.