Maneira simples de reiniciar os processos travados?

10

Eu preciso monitorar vários processos em execução no meu servidor da web. Por algum motivo, o verniz falha atualmente uma vez a cada dois dias. Eu estou usando monit para supostamente reiniciar o verniz automaticamente, mas não funciona. Aqui está a minha entrada monit.conf para verniz.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

O arquivo de log mostra que, após a execução do verniz, a tentativa de reinicialização ocorrerá depois. Então, eventualmente, o monit para de monitorar o verniz.

Alguém tem sugestões de como posso corrigir isso? Ou, melhor ainda, você pode sugerir outras maneiras simples de monitorar e reiniciar automaticamente os processos que falharam? Obrigado!

    
por Lin 12.08.2009 / 00:09

5 respostas

17

Eu procuraria os daemontools ( link ).

O supervise foi criado exatamente para esse propósito - para iniciar processos e assisti-los, reiniciando-os imediatamente se eles terminarem.

Você ainda pode usar o monit se precisar fazer algo mais complicado que uma simples verificação "ainda está em execução" e, se o processo precisar ser reiniciado, faça isso por meio de supervisão.

    
por 12.08.2009 / 00:41
4

Você também pode usar / etc / inittab para reiniciar processos mortos usando a ação respawn .

Veja a seção inittab no link

    
por 12.08.2009 / 18:20
2

Você pode usar scripts de manipulador de eventos com o Nagios se tiver isso em vigor para reiniciar os serviços.

Se o verniz exigir permissão de root para iniciar (os scripts init.d normalmente usam), altere "/etc/init.d/varnish start" para "sudo /etc/init.d/varnish start". Mas isso provavelmente não será suficiente já que você provavelmente não quer dar qualquer usuário monit executado como privilégios sudo nopasswd total para todos os comandos e dar sudo para um script de shell seria basicamente tão ruim. Assim, você precisará descobrir quais comandos nesse script de init precisam do sudo, fornecer a esses comandos os sudo privileges no arquivo / etc / sudoers para o usuário monit e, finalmente, editar esse script de init de acordo. Ou talvez em vez de todo esse verniz possa ser executado como usuário não-root?

Finalmente, tenho certeza que você sabe disso, mas vou dizer de qualquer maneira. Você está claramente se esforçando muito nisso, espero que você esteja se esforçando tanto para descobrir por que o verniz está falhando e realmente consertando (ou perseguindo os desenvolvedores para descobrir o porquê): -)

Atualização:
Isso pode não ser tão limpo, mas uma maneira fácil de fazer isso como root pode ser configurar um script que verifique se o processo está correto e, se não, iniciá-lo. Em seguida, basta executar esse script a cada dois minutos como um cron job.

    
por 12.08.2009 / 02:42
1

Outro ótimo método retirado do StackOverflow :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Isso pode ser adicionado ao crontab:

crontab -e

Em seguida, adicione uma regra para iniciar seu script de monitor:

@reboot /usr/local/bin/myservermonitor

Ou adicionado como um script em /etc/init.d

Veja a resposta do StackOverflow para obter uma explicação detalhada sobre por que essa é uma boa abordagem.

    
por 05.11.2013 / 23:51
0

Eu também estava procurando a maneira mais simples de lidar com esse problema. A maneira mais fácil que encontrei é simplesmente adicionar Restart=allways ao arquivo .service em /etc/systemd/system/multi-user.target.wants/ como última linha da tag [service] .

Depois disso, sudo systemctl daemon-reload seguido por sudo systemctl restart service.service para recarregar as alterações.

Você pode testar, verificando se o serviço está sendo executado: systemctl status processname , verifique o timestamp de início. Depois disso, ps -ef | grep servicename , ad kill o processo com o ID encontrado apenas kill 1234 . depois disso, faça systemctl status processname novamente e verifique se o timestamp de início está atualizado.

Deve funcionar em:

  • Debian 7 e Debian 8
  • Ubuntu 15.04 e mais recente
  • CentOS 7 e futuro
por 19.12.2017 / 14:34