Script Bash pour détecter quand mon serveur est en panne ou hors ligne

17

Contexte: je dois recevoir une alerte lorsque mon serveur est en panne. Lorsque le serveur est en panne, le collecteur Sysload ne pourra peut-être pas envoyer d’alerte. Pour recevoir une alerte lorsque le serveur est en panne, j'ai une source externe (serveur) pour le détecter.

Question: Existe-t-il un moyen (je préfère le script bash) de détecter quand mon serveur est en panne ou hors ligne et envoie un message d'alerte (Email + SMS)?

Md Mahbubur Rahman
la source

Réponses:

24

Si vous avez un serveur distinct pour exécuter votre script de vérification, quelque chose comme ceci ferait un simple test Ping pour voir si le serveur est vivant:

#!/bin/bash
SERVERIP=192.168.2.3
[email protected]

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

Vous pouvez exécuter le script périodiquement.

Si vous n'avez pas mailx, vous devrez remplacer cette ligne par le programme de messagerie en ligne de commande que vous avez et probablement changer les options. Si votre opérateur fournit une adresse e-mail SMS, vous pouvez envoyer l'e-mail à cette adresse. Par exemple, avec AT & T, si vous envoyez un courriel à phonenumber @ txt.att.net, il envoie l'e - mail à votre téléphone.

Voici une liste des e-mails vers les passerelles SMS:

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

Si votre serveur est un serveur Web accessible au public, il existe des services gratuits pour surveiller votre site Web et vous alerter en cas de panne, recherchez une surveillance gratuite du site Web pour en trouver.

Johnny
la source
Pouvez-vous détailler le message d'alerte SMS?
Md Mahbubur Rahman
4
Au lieu de faire un ping sur le serveur, vous devez tester tout ce que vous faites pour le serveur. Par exemple, s'il s'agit d'un serveur de messagerie, il est beaucoup plus important qu'il envoie et reçoive avec succès du courrier.
Jim Paris
Je suis resté à l'écart de la détection des applications dans ma réponse car la question ne spécifiait pas quels services étaient en cours d'exécution sur le serveur - il a demandé une détection de montée / descente du serveur. Il existe des centaines de services communs qui pourraient être détectés et un nombre illimité d'applications personnalisées. On dirait qu'il a un moniteur de service local (sysload) qui surveille les services.
Johnny
Ping est presque inutile pour moi. J'ai un serveur en panne et je reçois 3 paquets sur 3 retournés et une valeur de retour finale de 0. Comment ça se fait? La machine locale renvoie des paquets "Hôte de destination inaccessible".
AlastairG
@AlastairG - ce serait mieux posé comme une question, il n'y a pas assez de place dans un commentaire pour y répondre. Mais recherchez d'abord sur le site pour voir si quelqu'un a posé une question similaire, vous pouvez y trouver votre réponse.
Johnny
9

Le ping est une option, mais à plusieurs reprises, une machine sera en mesure d'envoyer une réponse ping, tandis que le serveur dont il s'agit est en panne. Il vaut mieux faire un test de bout en bout. Dans l'exemple ci-dessous, une page est demandée au serveur Web.

S'il s'agit d'un serveur Web, il ressemblerait à ceci:

#!/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'
}

Si vous changez le document html en un document php et faites des tests de script de php comme la connexion à la base de données, les systèmes de fichiers, etc., vous pouvez même tester plus d'aspects du serveur. De cette façon, vous pouvez démarrer une surveillance proactive de la machine (voir les problèmes avant qu'ils ne plantent le serveur).

Similaire à la vérification d'un serveur de messagerie, mais au lieu de demander une page Web, vous envoyez simplement un e-mail via le serveur de messagerie et voyez si vous le recevez dans votre boîte aux lettres

jippie
la source
si vous avez des e-mails root transférés dans votre boîte de réception, vous n'avez pas à envoyer de
mail
5

Voici comment j'ai résolu le même problème

#!/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
user54782
la source
J'ai dû m'adapter pour courir sur mon mac /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL
Cette solution fonctionne sûrement MAIS. (1) si vous appelez cela sur la machine locale, je suppose que cela vous dira qu'apache est mort, même si je ne le ferais pas de cette façon. (2) Si vous l'utilisez sur la machine locale et que le réseau est en panne ou quelque chose entre cette boîte et son serveur de périphérie ou quelque chose, vous n'obtiendrez pas l'e-mail et ou il ne saura pas qu'il y a un problème. (3) Si vous l'utilisez sur une autre machine, votre commande curl prendra un LONG temps pour expirer, sauf indication contraire, donc si vous regardiez plusieurs hôtes, cela s'arrêterait.
Mike Q
1

Je recommanderais fortement d'utiliser Nagios , c'est une infrastructure de surveillance et d'alerte sur n'importe quel service que vous souhaitez (de nombreux plugins disponibles et vous pouvez écrire le vôtre). Il peut bien sûr faire des pings simples pour vérifier la disponibilité des serveurs, mais comme d'autres l'ont souligné, il est préférable de vérifier la disponibilité des services (par exemple Web, e-mail, etc.) à la place (ce que les nagios peuvent faire facilement).

emerino
la source
c'est un produit sympa, je me pose des questions de sécurité
Mike Q