Maneira simples de reiniciar processos travados?

10

Eu preciso monitorar vários processos em execução no meu servidor web. Por alguma razão, o verniz atualmente falha uma vez por dia ou dois. Estou usando o monit para supostamente reiniciar o verniz automaticamente, mas não funciona. Aqui está a minha entrada monit.conf para o Varnish.

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, depois que o verniz para de ser executado, a tentativa de reinicialização ocorre 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 travados? Obrigado!

Lin
fonte
Eu não posso acreditar o quão difícil essas coisas eram nos tempos pré-sistêmicos.
Fl0v0 5/06/19

Respostas:

17

Eu procuraria em daemontools ( http://cr.yp.to/daemontools.html ).

A supervisão foi criada exatamente para esse propósito - iniciar processos e observá-los, reiniciando-os imediatamente se eles terminarem.

Você ainda pode usar o monit se precisar fazer algo mais complicado do que uma verificação simples "ainda está em execução" e se o processo precisar ser reiniciado, faça-o através da supervisão.

Ian Clelland
fonte
Também uso os daemontools, para monitorar processos de serviços instáveis. Bastante útil se eu tivesse que dizer. :-)
edomaur
4

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

Consulte a seção inittab em http://aplawrence.com/Unixart/startup.html

Shawn Chin
fonte
2

Você pode usar scripts de manipulador de eventos com o Nagios se tiver esse recurso para reiniciar os serviços.

Se o verniz exigir permissão de root para iniciar (scripts init.d geralmente fazem), mude "/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 deseja dar o que o usuário monit executa como privilégios totais do sudo nopasswd a todos os comandos, e dar o sudo a um script de shell seria basicamente tão ruim quanto. Então, você precisará descobrir quais comandos nesse script init precisam do sudo, conceder esses comandos privilégios sudo no arquivo / etc / sudoers ao usuário monit e, finalmente, editar esse script init adequadamente. 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 ao máximo para descobrir por que o verniz está falhando e realmente corrigi-lo (ou perseguir 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á bom e se não o inicia. Em seguida, basta executar esse script a cada dois minutos como um trabalho cron.

Kyle Brandt
fonte
Eu considerei Nagios no começo, mas queria algo pequeno e simples para meus propósitos. E sim, estou analisando a questão do verniz. Um dos meus servidores o está executando há muito tempo, por isso definitivamente tem a ver comigo. :( #
Lin
1

Outro ótimo método extraído 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 o script do seu monitor:

@reboot /usr/local/bin/myservermonitor

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

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

Cory Klein
fonte
0

Eu também estava procurando a maneira mais simples de lidar com esse problema. A maneira mais fácil de encontrar é simplesmente adicionar Restart=allwaysao .servicearquivo em questão a /etc/systemd/system/multi-user.target.wants/última linha da [service]tag.

Depois disso, faça o sudo systemctl daemon-reloadseguinte sudo systemctl restart service.servicepara recarregar as alterações.

Você pode testar verificando se o serviço está sendo executado systemctl status processname:, verifique o registro de data e hora de início. Depois disso ps -ef | grep servicename, interrompa o processo com o ID recém-encontrado kill 1234. depois disso, faça systemctl status processnamenovamente e verifique se o registro de data e hora de início é atualizado.

Deve funcionar em:

  • Debian 7 e Debian 8
  • Ubuntu 15.04 e mais recente
  • CentOS 7 e futuros
RoDo
fonte