script para testar automaticamente se um site está disponível

18

Sou um desenvolvedor web solitário com meu próprio Centos VPS hospedando alguns pequenos sites para meus clientes. Hoje eu descobri que o meu serviço httpd tinha parado (sem motivo aparente - mas isso é outro segmento). Eu reiniciei, mas agora eu preciso encontrar uma maneira que eu possa ser notificado por e-mail e / ou SMS, se isso acontecer novamente - Eu não gosto quando meu cliente me liga para me dizer que seu site não funciona!

Eu sei que provavelmente existem muitas possibilidades diferentes, incluindo software de monitoramento de servidores. Eu acho que tudo que eu realmente preciso é um script que eu possa executar como um cron job do meu host dev (que está permanentemente em execução no meu escritório) que tenta carregar uma página do meu servidor de produção e se ele não for carregado segundos então me envia um email ou SMS. Eu sou muito lixo em scripts de shell, daí esta questão.

Qualquer sugestão será apreciada com gratidão.

    
por Xoundboy 20.06.2011 / 16:37

8 respostas

12

Bem ... O roteiro mais simples, eu escrevo:

/usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || echo "The site is down" | /usr/bin/mail -v -s "Site is down" [email protected]

Adicione ao cron como:

* * * * * /usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null  | grep "Normal operation string" || echo "The site is down" | /usr/bin/mail -v -s "Site is down" [email protected]

Mas é simples demais dizer qual é o problema se ele existir.

UPD: Agora, este one-liner verifica uma string específica na página ("String de operação normal"), que deve aparecer apenas na operação normal.

UPD2: Uma maneira simples de enviar a página de erro no e-mail:

/usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || /usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | /usr/bin/mail -v -s "Site is down" [email protected]

É menos que a página é re-solicitada em caso de falha do primeiro teste. Desta vez, a solicitação pode ser bem-sucedida e você não verá o erro. Naturalmente, é possível armazenar a saída e enviá-la como um anexo, mas isso tornará o script mais complexo.

    
por 20.06.2011 / 17:00
8

Veja este script:

curl é um utilitário de linha de comando para buscar uma URL. O script verifica o código de saída ($? Refere-se ao código de saída do comando mais recente em um shell script) e se for diferente de 0, relata um erro (um código de saída de 0 geralmente se refere ao sucesso). Como mencionado na resposta do HUB, você também pode apenas || na linha de comando para executar um segundo comando quando o primeiro falhar.

Depois que você descobrir o status, basta enviar alguns e-mails para você mesmo. Aqui está um exemplo que usa o comando mail para enviar e-mail de um script de shell, supondo que a caixa da qual você está testando tenha a configuração de SMTP:

BTW: se você não é bom em scripts de shell, não se limite a um shell script. Você pode usar um script ruby, um script php, qualquer tipo de script que seu servidor possa executar! Basta adicionar a linha #!/path/to/executable no início do script - por exemplo:

#!/usr/bin/php

    
por 20.06.2011 / 17:30
3

Verifique este script . está checando uma lista de sites e envia e-mails (para uma lista de e-mails) sempre que algo estiver errado (resposta http diferente de 200). O script cria um arquivo .temp para "lembrar" qual site (s) falhou na última verificação, para que você não receba vários e-mails. o arquivo .temp é excluído quando o site está funcionando novamente.

#!/bin/bash
# list of websites. each website in new line. leave an empty line in the end.
LISTFILE=/scripts/isOnline/websites.lst
# Send mail in case of failure to. leave an empty line in the end.
EMAILLISTFILE=/scripts/isOnline/emails.lst

# 'Quiet' is true when in crontab; show output when it's run manually from shell.
# Set THIS_IS_CRON=1 in the beginning of your crontab -e.
# else you will get the output to your email every time
if [ -n "$THIS_IS_CRON" ]; then QUIET=true; else QUIET=false; fi

function test {
  response=$(curl --write-out %{http_code} --silent --output /dev/null $1)
  filename=$( echo $1 | cut -f1 -d"/" )
  if [ "$QUIET" = false ] ; then echo -n "$p "; fi

  if [ $response -eq 200 ] ; then
    # website working
    if [ "$QUIET" = false ] ; then
      echo -n "$response "; echo -e "\e[32m[ok]\e[0m"
    fi
    # remove .temp file if exist.
    if [ -f cache/$filename ]; then rm -f cache/$filename; fi
  else
    # website down
    if [ "$QUIET" = false ] ; then echo -n "$response "; echo -e "\e[31m[DOWN]\e[0m"; fi
    if [ ! -f cache/$filename ]; then
        while read e; do
            # using mailx command
            echo "$p WEBSITE DOWN" | mailx -s "$1 WEBSITE DOWN" $e
            # using mail command
            #mail -s "$p WEBSITE DOWN" "$EMAIL"
        done < $EMAILLISTFILE
        echo > cache/$filename
    fi
  fi
}

# main loop
while read p; do
  test $p
done < $LISTFILE

Adicione as seguintes linhas à configuração do crontab ($ crontab -e)

THIS_IS_CRON=1
*/30 * * * * /path/to/isOnline/checker.sh

Disponível no Github

    
por 09.08.2014 / 17:01
2

Eu sei que todos os scripts acima são exatamente o que você pediu, mas eu sugiro olhar para o monit porque ele enviará um e-mail se o apache estiver inativo, mas também o reiniciará (se estiver inativo).

    
por 20.06.2011 / 17:43
1

Eu recomendaria pingdom para isso. Seu serviço gratuito permite que você verifique 1 site, mas isso é tudo que você precisa para verificar um servidor. Se você tem um iPhone, ele envia uma mensagem de graça, então não é necessário comprar créditos SMS deles, e eles têm várias configurações que você pode usar. O meu está configurado para me notificar após 2 novas tentativas (10min) e a cada 10min de tempo de inatividade depois disso. É incrível, pois também verifica mensagens HTTP 500 indicando que um site está inativo. Se falhar, ele verifica imediatamente seu site novamente de um servidor diferente em um local diferente. Se esse falhar, bem, isso desencadeia sua preferência em como / quando você gostaria de ser notificado.

    
por 20.06.2011 / 16:55
0

Como você tem muitos sites no seu VPS, recomendo que você possa abrir uma conta no site de monitoramento de sites, como host-tracker.com. Além de alertá-lo se o site está em baixo ou não, eles também fornecem uptime semanal, mensal e anual de seus sites. O desejo é muito útil para gerenciamento e desempenho.

    
por 21.06.2011 / 08:53
0

Que tal isso:

#!/bin/bash
/etc/init.d/httpd status
if [[ $? == 3 ]]; then
   echo "Httpd is down 'date'" | mail [email protected]
   exit 1
fi
exit 0
    
por 21.06.2011 / 08:58
0

Pequena variação do acima.

Um script para verificar se um site está disponível a cada 10 segundos. Registrar tentativas com falha em um arquivo siteuptime.txt para que possa ser analisado (ou representado graficamente no Excel) mais tarde.

#!/bin/bash
# Check site every 10 seconds, log failed connection attempts in siteuptime.txt
while true; do
echo "Checking site...";
/usr/bin/wget "http://www.mysite" --timeout 6 -O - 2>/dev/null | grep "My String On page" || echo "The site is down" | date --iso-8601=seconds >> siteuptime.txt;
sleep 10;
done;
    
por 12.04.2017 / 02:25