Script Bash para detectar quando meu servidor está inoperante ou offline

17

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

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

Md Mahbubur Rahman
fonte

Respostas:

24

Se você tiver um servidor separado para executar seu script de verificação, algo como isso faria um teste simples de Ping para verificar 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 agendar o script para executar periodicamente.

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

Aqui está uma lista de emails para gateways SMS:

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

Se o seu servidor for um servidor da web acessível ao público, existem alguns serviços gratuitos para monitorar seu site e alertá-lo se estiver inativo, pesquise na web um monitoramento gratuito do site para encontrar alguns.

Johnny
fonte
Você pode detalhar a mensagem de alerta por SMS?
Md Mahbubur Rahman
4
Em vez de executar ping no servidor, você deve testar o que quer que seja que ele esteja fazendo. Por exemplo, se for um servidor de correio, é muito mais importante que ele envie e receba com êxito.
Jim Paris
Fiquei longe da detecção de aplicativos em minha resposta, pois a pergunta não especificou quais serviços estão sendo executados no servidor - ele pediu a detecção de ativação / desativação do servidor. Existem centenas de serviços comuns que podem ser detectados e um número ilimitado de aplicativos personalizados. Parece que ele tem um monitor de serviço local (sysload) que está monitorando os serviços.
22412 Johnny
Ping é praticamente inútil para mim. Eu tenho um servidor inoperante, mas recebo 3 dos 3 pacotes retornados e um valor de retorno final igual a 0. Como é? A máquina local está retornando pacotes "Host de destino inacessível".
AlastairG
@AlastairG - isso seria melhor perguntado como uma pergunta, não há espaço suficiente em um comentário para respondê-lo. Mas pesquise primeiro no site para ver se alguém fez uma pergunta semelhante, você pode encontrar sua resposta lá.
9119 Johnny
9

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

Se for um servidor da 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ê mudar o documento html para 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ê poderá testar ainda mais aspectos do servidor. Dessa forma, você pode iniciar o monitoramento proativo da máquina (consulte os problemas antes que eles causem pane no servidor).

Semelhante à verificação de um servidor de correio, mas em vez de solicitar uma página da Web, você simplesmente envia um email através do servidor de correio e verifica se o recebe em sua caixa de correio.

jippie
fonte
se você tem e-mails raiz encaminhadas para sua caixa de entrada, você não tem que sendmail se você executar esse script no crontab (porque ele vai enviar o stdout para você)
pscheit
5

Aqui está como eu 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
user54782
fonte
Eu tive que me adaptar para rodar no meu mac /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL
Esta solução certamente funciona, MAS. (1) se você estiver chamando isso na máquina local, acho que lhe dirá que o apache morreu, embora eu não o faça dessa maneira. (2) Se você usá-lo na máquina local e a rede estiver inoperante ou algo entre esta caixa e o servidor de borda ou algo assim, você não receberá o e-mail e não saberá se há um problema. (3) Se você usar isso em outra máquina, o comando curl vai levar um longo tempo para o tempo limite a menos que especificado, então ifyou estavam olhando para anfitriões mulitple seria moer a um impasse ..
Mike Q
1

Eu recomendo usar o Nagios , é uma infraestrutura para monitorar e alertar sobre qualquer serviço que você desejar (muitos plugins disponíveis e você pode escrever o seu). Obviamente, ele pode fazer pings simples para verificar a disponibilidade dos servidores, mas, como outros já apontaram, é melhor verificar a disponibilidade de serviços (por exemplo, web, email etc.) em vez disso (o que os nagios podem fazer facilmente).

emerino
fonte
é um produto legal, eu me pergunto sobre as preocupações de segurança
Mike Q