Script Bash para detectar cuando mi servidor está inactivo o desconectado

17

Antecedentes: necesito recibir una alerta cuando mi servidor está inactivo. Cuando el servidor está inactivo, tal vez el recopilador Sysload no podrá enviar ninguna alerta. Para recibir una alerta cuando el servidor está inactivo, tengo una fuente externa (servidor) para detectarlo.

Pregunta: ¿Hay alguna forma (prefiero el script bash) para detectar cuándo mi servidor está inactivo o fuera de línea y envía un mensaje de alerta (correo electrónico + SMS)?

Md Mahbubur Rahman
fuente

Respuestas:

24

Si tiene un servidor separado para ejecutar su secuencia de comandos de verificación, algo como esto haría una simple prueba de Ping para ver si el servidor está vivo:

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

Puede cron la secuencia de comandos para ejecutar periódicamente.

Si no tiene mailx, deberá reemplazar esa línea con cualquier programa de correo electrónico de línea de comando que tenga y probablemente cambiar las opciones. Si su proveedor proporciona una dirección de correo electrónico SMS, puede enviar el correo electrónico a esa dirección. Por ejemplo, con AT&T, si envía un correo electrónico a phonenumber @ txt.att.net, enviará el correo electrónico a su teléfono.

Aquí hay una lista de puertas de enlace de correo electrónico a SMS:

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

Si su servidor es un servidor web de acceso público, hay algunos servicios gratuitos para monitorear su sitio web y alertarlo si está caído, busque en la web monitoreo gratuito del sitio web para encontrar algunos.

Johnny
fuente
¿Pueden dar detalles sobre el mensaje de alerta SMS?
Md Mahbubur Rahman
44
En lugar de hacer ping al servidor, debe probar lo que sea que le interese hacer al servidor. Por ejemplo, si se trata de un servidor de correo, es mucho más importante que envíe y reciba correo con éxito.
Jim Paris
Me mantuve alejado de la detección de aplicaciones en mi respuesta ya que la pregunta no especificaba qué servicios se están ejecutando en el servidor: solicitó la detección de servidor activo / inactivo. Hay cientos de servicios comunes que podrían detectarse y un número ilimitado de aplicaciones personalizadas. Parece que tiene un monitor de servicio local (sysload) que supervisa los servicios.
Johnny
Ping es casi inútil para mí. Tengo un servidor inactivo pero recibo 3 de 3 paquetes devueltos y un valor de retorno final de 0. ¿Cómo es que? La máquina local está devolviendo paquetes "Host de destino inalcanzable".
AlastairG
@AlastairG: sería mejor hacer una pregunta, no hay suficiente espacio en un comentario para responderla. Pero primero busque en el sitio para ver si alguien hizo una pregunta similar, allí puede encontrar su respuesta.
Johnny
9

Hacer ping es una opción, pero en muchas ocasiones una máquina podrá enviar una respuesta de ping, mientras que el servidor real del que se trata está inactivo. Es mejor hacer una prueba de punta a punta. En el siguiente ejemplo, se solicita una página del servidor web.

Si es un servidor web, se vería así:

#!/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 cambia el documento html a un documento php y hace que el script de php pruebe cosas como la conexión de la base de datos, los sistemas de archivos, etc., incluso puede probar más aspectos del servidor. De esa manera, puede comenzar la supervisión proactiva de la máquina (vea los problemas antes de que se bloquee el servidor).

Similar a verificar un servidor de correo, pero en lugar de solicitar una página web, simplemente envíe un correo electrónico a través del servidor de correo y vea si lo recibe en su buzón

jippie
fuente
si recibió correos electrónicos raíz enviados a su bandeja de entrada, no tiene que enviarlos si ejecuta este script en el crontab (porque le enviará el stdout)
pscheit
5

Así es como resolví el mismo 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
usuario54782
fuente
Tuve que adaptarme para ejecutar en mi mac /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL
Esta solución seguramente funciona PERO. (1) si está llamando a esto en la máquina local, supongo que le dirá que Apache murió, aunque no lo haría de esta manera. (2) Si usa esto en la máquina local y la red está inactiva o algo entre este cuadro y su servidor perimetral o algo así, no recibirá el correo electrónico o no sabrá que hay un problema. (3) Si usa esto en otra máquina, su comando de curl tardará MUCHO tiempo de espera, a menos que se especifique, por lo que si estuviera mirando múltiples hosts se detendría ..
Mike Q
1

Recomiendo encarecidamente usar Nagios , es una infraestructura para monitorear y alertar sobre cualquier servicio que desee (hay muchos complementos disponibles y puede escribir el suyo). Por supuesto, puede hacer pings simples para verificar la disponibilidad de los servidores, pero como otros han señalado, es mejor verificar la disponibilidad de servicios (por ejemplo, web, correo electrónico, etc.) en su lugar (que Nagios puede hacer fácilmente).

emerino
fuente
es un producto genial, me pregunto por las preocupaciones de seguridad
Mike Q