Como posso reiniciar automaticamente o Apache e o Varnish se não puder buscar um arquivo?

1

Eu preciso reiniciar o Apache e o Varnish e enviar alguns logs por e-mail quando o script não conseguir recuperar o robots.txt, mas estou recebendo um erro

./healthcheck: 43 [[: not found

Meu servidor é Ubuntu 12,04 64 bits

#!/bin/sh
# Check if can fetch robots.txt if not then restart Apache and Varnish
# Send last few lines of logs with date via email

PATH=/bin:/usr/bin
THEDIR=/tmp/web-server-health
[email protected]
mkdir -p $THEDIR

if ( wget --timeout=30 -q -P $THEDIR http://website.com/robots.txt )
then
    # we are up
    touch ~/.apache-was-up
else
    # down! but if it was down already, don't keep spamming
    if [[ -f ~/.apache-was-up ]]
    then
        # write a nice e-mail
        echo -n "Web server down at " > $THEDIR/mail
        date >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "Apache Log:" >> $THEDIR/mail
        tail -n 30 /var/log/apache2/error.log >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "AUTH Log:" >> $THEDIR/mail
        tail -n 30 /var/log/auth.log >> $THEDIR/mail
        echo >> $THEDIR/mail
        # kick apache
        echo "Now kicking apache..." >> $THEDIR/mail
        /etc/init.d/varnish stop >> $THEDIR/mail 2>&1
        killall -9 varnishd >> $THEDIR/mail 2>&1
        /etc/init.d/varnish start >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1
        killall -9 apache2 >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 start >> $THEDIR/mail 2>&1
        # prepare the mail
        echo >> $THEDIR/mail
        echo "Good luck troubleshooting!" >> $THEDIR/mail
        # send the mail
        sendemail -o message-content-type=html -f [email protected] -t $EMAIL -u ALARM -m < $THEDIR/mail
        rm ~/.apache-was-up
    fi
fi

rm -rf $THEDIR
    
por Tyler 12.06.2012 / 03:03

4 respostas

2

if [[ -f ~/.apache-was-up ]]

No Ubuntu, /bin/sh é um link simbólico para traço em vez de bash . O dash é um shell mínimo projetado para scripts, enquanto o bash é mais caracterizado e projetado para uso interativo. A sintaxe [[ <expression> ]] é implementada apenas no bash, não no traço e, portanto, você recebe esse erro. A sintaxe [ <expression> ] é suficiente para o que você precisa, então mude essa linha para isso:

if [ -f ~/.apache-was-up ]
    
por 12.06.2012 / 03:44
2

Acho que é isso que você está procurando (prefiro / tmp, já que ele é removido depois de uma reinicialização, portanto, um novo começo).

#!/bin/sh
# Check if can fetch robots.txt if not then restart Apache and Varnish
# Send last few lines of logs with date via email

PATH=/bin:/usr/bin
THEDIR=/tmp/web-server-health
[email protected]
mkdir -p $THEDIR

if ( wget --timeout=30 -q -P $THEDIR http://website.com/robots.txt )
then
    # we are up
    touch /tmp/.apache-was-up
else
    # down! but if it was down already, don't keep spamming
    if [  -f /tmp/.apache-was-up ];
    then
        # write a nice e-mail
        echo -n "Web server down at " > $THEDIR/mail
        date >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "Apache Log:" >> $THEDIR/mail
        tail -n 30 /var/log/apache2/error.log >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "AUTH Log:" >> $THEDIR/mail
        tail -n 30 /var/log/auth.log >> $THEDIR/mail
        echo >> $THEDIR/mail
        # kick apache
        echo "Now kicking apache..." >> $THEDIR/mail
        /etc/init.d/varnish stop >> $THEDIR/mail 2>&1
        killall -9 varnishd >> $THEDIR/mail 2>&1
        /etc/init.d/varnish start >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1
        killall -9 apache2 >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 start >> $THEDIR/mail 2>&1
        # prepare the mail
        echo >> $THEDIR/mail
        echo "Good luck troubleshooting!" >> $THEDIR/mail
        # send the mail
        sendemail -o message-content-type=html -f [email protected] -t $EMAIL -u ALARM -m < $THEDIR/mail
        rm /tmp/.apache-was-up
    fi
fi

rm -rf $THEDIR
    
por 12.06.2012 / 03:10
2

Embora o script possa funcionar, há alguns problemas com ele, como o uso não seguro de arquivos temporários.

Você realmente deve dar uma olhada em Monit , é de código aberto e é fácil escrever uma regra que reinicie seus serviços da Web com base nas respostas do serviço. Ele também pode detectar se um processo em execução morre (por exemplo, seu PID desaparece) e você tem a possibilidade de desativar temporariamente uma verificação (por exemplo, quando você está fazendo uma manutenção de serviço).

    
por 17.06.2012 / 18:38
2

Aqui está uma resposta detalhada sobre como usar o Monit para monitorar e reiniciar o Varnish se estiver desativado.

Primeiro, visite link para obter algumas informações básicas sobre o Monit e instalá-lo. Este é um tutorial útil, pois fornece os caminhos padrão para o RHEL / CentOS e o Debian / Ubuntu.

Em segundo lugar, visite link e siga as instruções sobre como configurar o monitoramento do verniz.

Aqui estão algumas notas da minha configuração:

  • Eu recomendaria usar o URL / verniz-ping para o URL de ping VCL. É um caminho lógico que é fácil de lembrar. Você pode testar isso depois de configurar curl 127.0.0.1:80/varnish-ping na linha de comando & certificando-se de que ele retorne uma resposta de 200.
  • Certifique-se de que você tem o direito de verniz pid. Como afirmado no segundo artigo, você pode encontrar isso no script de inicialização. O meu foi na verdade / var / run / varnish.pid. Você pode fazer um ls para se certificar de que o arquivo existe enquanto o verniz está sendo executado.
  • Você provavelmente desejará permitir o acesso à interface da Web do Monit para ajudar no monitoramento. Se você tiver um firewall, primeiro precisará adicionar a porta 2812 às portas permitidas. Em seguida, altere quais IPs têm permissão para acessar de acordo com link . Você pode especificar seu próprio IP remoto em vez de 0.0.0.0/8 para maior segurança. Note que a senha é passada através de HTTP Auth, então você não deve usar uma senha que você queira manter particularmente segura.
  • Certifique-se de que o log do Monit esteja ativo. Verifique o log "set log" para se certificar de que tem algo como set log /var/log/monit.log .
  • Se instalar o Varnish não o colocar na lista de daemons para iniciar a reinicialização do sistema, você terá que adicioná-lo via chkconfig (ou equivalente do Ubuntu / Debian). Eu corri chkconfig --list para confirmar que estava presente.

Espero que ajude a apresentar uma alternativa mais confiável. Observe que você também pode adicionar monitoramento de email para serviços via Monit também. Aqui estão mais alguns detalhes especificamente sobre alertas de email: link

    
por 25.02.2016 / 17:36