Script di Bash per rilevare quando il mio server è inattivo o offline


17

Sfondo: ho bisogno di ricevere un avviso quando il mio server è inattivo. Quando il server è inattivo, forse il raccoglitore Sysload non sarà in grado di inviare alcun avviso. Per ricevere un avviso quando il server è inattivo, ho una fonte esterna (server) per rilevarlo.

Domanda: esiste un modo (preferisco lo script bash) per rilevare quando il mio server è spento o offline e invia un messaggio di avviso (e-mail + SMS)?

Risposte:


24

Se hai un server separato su cui eseguire lo script di controllo, qualcosa del genere farebbe un semplice test Ping per vedere se il server è attivo:

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

È possibile cronizzare l'esecuzione periodica dello script.

Se non hai mailx, dovrai sostituire quella riga con qualsiasi programma di posta elettronica della riga di comando che hai e probabilmente modificare le opzioni. Se il tuo operatore fornisce un indirizzo e-mail SMS, puoi inviare l'e-mail a quell'indirizzo. Ad esempio, con AT & T, se si invia una mail a phonenumber @ txt.att.net, invierà l'e-mail sul telefono.

Ecco un elenco di e-mail ai gateway SMS:

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

Se il tuo server è un server web accessibile pubblicamente, ci sono alcuni servizi gratuiti per monitorare il tuo sito Web e avvisarti se è inattivo, cerca nel Web il monitoraggio gratuito del sito Web per trovarne alcuni.


Puoi fornire dettagli sul messaggio di avviso SMS?
Md Mahbubur Rahman,

4
Invece di eseguire il ping del server, dovresti testare qualunque cosa ti interessi del server. Ad esempio, se si tratta di un server di posta, è molto più importante che invii e riceva posta con successo.
Jim Paris,

Sono rimasto lontano dal rilevamento delle applicazioni nella mia risposta poiché la domanda non specificava quali servizi sono in esecuzione sul server - ha chiesto il rilevamento su / giù del server. Esistono centinaia di servizi comuni che potrebbero essere rilevati e un numero illimitato di applicazioni personalizzate. Sembra che abbia un monitor di servizi locali (sysload) che sta monitorando i servizi.
Johnny,

Il ping è quasi inutile per me. Ho un server inattivo ma ricevo 3 pacchetti su 3 restituiti e un valore di restituzione finale di 0. Come mai? Il computer locale sta restituendo i pacchetti "Host di destinazione non raggiungibile".
AlastairG

@AlastairG - sarebbe meglio fare una domanda, non c'è abbastanza spazio in un commento per rispondere. Ma cerca prima nel sito per vedere se qualcuno ha fatto una domanda simile, potresti trovare la tua risposta lì.
Johnny,

9

Il ping è un'opzione, ma in molte occasioni una macchina sarà in grado di inviare una risposta ping, mentre il server effettivo di cui si tratta è inattivo. È meglio fare un test end-to-end. Nell'esempio seguente una pagina è richiesta al server web.

Se è un server web, sarebbe simile a questo:

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

Se cambi il documento html in un documento php e fai in modo che lo script de php verifichi cose come la connessione al database, i filesystem ecc., Puoi persino testare più aspetti del server. In questo modo è possibile avviare il monitoraggio proattivo della macchina (vedere i problemi prima che causino l'arresto anomalo del server).

Simile al controllo di un server di posta, ma invece di richiedere una pagina Web, è sufficiente inviare un messaggio di posta elettronica tramite il server di posta e vedere se lo si riceve nella propria casella di posta


se hai ricevuto le email di root nella tua casella di posta, non devi inviare sendmail se esegui questo script nel crontab (perché ti invierà lo stdout)
pscheit

5

Ecco come ho risolto lo stesso problema

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

Ho dovuto adattarmi per correre sul mio mac /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL,

Questa soluzione sicuramente funziona MA. (1) se lo chiami sul computer locale immagino che ti dirà che Apache è morto, anche se non lo farei in questo modo. (2) Se lo usi sul computer locale e la rete è inattiva o qualcosa tra questa casella e il suo server perimetrale o qualcosa del genere, non riceverai l'e-mail e non saprà che c'è un problema. (3) Se lo usi su un'altra macchina, il tuo comando di arricciatura impiegherà molto tempo a scadere, a meno che non sia specificato, quindi se guardassi gli host mulitple si fermerebbe ..
Mike Q,

1

Consiglio vivamente di usare Nagios , è un'infrastruttura per il monitoraggio e la segnalazione di qualsiasi servizio tu voglia (molti plugin disponibili e puoi scriverne uno tuo). Ovviamente può fare semplici ping per verificare la disponibilità dei server, ma come altri hanno sottolineato, è meglio controllare invece la disponibilità dei servizi (ad es. Web, e-mail, ecc.) (Cosa che i nagios possono fare facilmente).


è un prodotto interessante, mi chiedo problemi di sicurezza
Mike Q,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.