Script Bash para detectar quando meu servidor está inativo ou off-line

16

Plano de fundo: preciso receber um alerta quando meu servidor estiver inoperante. Quando o servidor está inativo, talvez o coletor Sysload não possa enviar nenhum alerta. Para receber um alerta quando o servidor está inoperante, eu tenho uma fonte externa (servidor) para detectá-lo.

Pergunta: Existe alguma maneira (eu prefiro o script bash) para detectar quando meu servidor está inativo ou offline e envia uma mensagem de alerta (E-mail + SMS)?

    
por Md Mahbubur Rahman 22.11.2012 / 04:35

4 respostas

22

Se você tiver um servidor separado para executar o script de verificação, algo como isso faria um teste de ping simples para ver se o servidor está ativo:

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

Você pode cronografar o script para ser executado periodicamente.

Se você não tiver o mailx, você terá que substituir essa linha por qualquer programa de email de linha de comando que você tenha e provavelmente alterar as opções. Se sua operadora fornecer um endereço de e-mail SMS, você poderá enviar o e-mail para esse endereço. Por exemplo, com a AT & T, se você enviar um e-mail para phonenumber @ txt.att.net, ele enviará o e-mail para seu telefone.

Aqui está uma lista de e-mail para os gateways SMS:

link

Se o seu servidor for um servidor da Web acessível publicamente, existem alguns serviços gratuitos para monitorar seu site e alertá-lo se estiver inoperante, pesquise na web pelo monitoramento gratuito de sites para encontrar alguns.

    
por 22.11.2012 / 05:00
9

O ping é uma opção, mas em muitas ocasiões uma máquina poderá enviar uma resposta de ping, enquanto o servidor real em que está tudo está inativo. É melhor fazer um teste de ponta a ponta. No exemplo abaixo, uma página é solicitada do servidor da web.

Se é um servidor web, seria algo como isto:

#!/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 você alterar o documento html em um documento php, e fazer com que o script php teste coisas como a conexão com o banco de dados, sistemas de arquivos, etc., você pode até testar mais aspectos do servidor. Dessa forma, você pode iniciar o monitoramento proativo da máquina (veja os problemas antes que eles causem a falha do servidor).

Similar à verificação de um servidor de e-mail, mas ao invés de solicitar uma página web, você simplesmente envia um e-mail através do servidor de e-mail e vê se você o recebe em sua caixa postal

    
por 22.11.2012 / 08:35
5

Veja como resolvi o mesmo 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
    
por 17.12.2013 / 13:53
1

Eu recomendo usar Nagios , é uma infra-estrutura para monitorar e alertar sobre qualquer serviço que você quiser (muitos plug-ins disponíveis e você pode escreva o seu próprio). É claro que pode fazer pings simples para verificar a disponibilidade dos servidores, mas, como outros apontaram, é melhor verificar a disponibilidade dos serviços (por exemplo, web, email, etc.) em seu lugar (o que os nagios podem fazer facilmente).

    
por 24.02.2015 / 20:25