web-dev-qa-db-fra.com

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

Contexte: je dois recevoir une alerte lorsque mon serveur est en panne. Lorsque le serveur est arrêté, 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)?

18
Md Mahbubur Rahman

Si vous avez un serveur distinct pour exécuter votre script de vérification, quelque chose comme ça 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 e-mail à numéro de téléphone @ txt.att.net, il enverra l'e-mail à votre téléphone.

Voici une liste de courriels à SMS passerelles:

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 sur le Web surveillance gratuite du site Web pour en trouver.

24
Johnny

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

9
jippie

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
5
user54782

Je recommande 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).

1
emerino