Como posso reiniciar automaticamente um processo depois que ele termina?

11

Eu tenho um programa golang que quero reiniciar depois que ele termina em uma caixa Debian Squeeze. A coisa está servindo HTTP por trás de uma configuração mod_proxy do Apache 2. Não espero que o processo falhe, mas gostaria de ter algum seguro contra isso.

No Ubuntu, eu teria usado o iniciante para manter o processo vivo. O Debian não gosta do Upstart pelo que entendo, pois é um substituto do init.

Existe uma alternativa que reinicie um ou mais processos depois que eles terminam, que funciona no Squeeze e funciona bem com o init?

Excluído
fonte
Você poderia reformular sua pergunta? Você deseja reiniciar um processo depois que ele foi finalizado?
mailq
Eu gostaria de reiniciar um processo automaticamente se ele falhar ou terminar automaticamente.
Excluído
2
O programa init tradicional faz exatamente isso. Por que as pessoas pensaram que seria uma boa ideia usar o init para executar um script de shell que invoque um script de shell que inicie outro processo que faça a mesma coisa, mas sem um pânico e reinicialização automáticos do kernel, caso esse processo falhe, está completamente além de mim.
Simon Richter # 03
Esse é um argumento justo. Vou investigar apenas usando init também. Estou empacotando o software usando o dpkg, portanto, a criação de scripts init não deve ser uma dificuldade.
Excluído

Respostas:

10

O melhor caminho a seguir é o daemontools. Eles permitem monitorar e reaparecer processos.

Consulte a documentação em seu site: http://cr.yp.to/daemontools.html

mailq
fonte
1
Obrigado - é exatamente isso que estou procurando. DJB = bom como regra. Na verdade, eu deveria ter lembrado que existia o fato de passar 5 anos cuidando do qmail!
Excluído
O mesmo comigo, exceto que eu costumava cuidar dos djbdns por algum tempo.
Mr.B
10

supervisionar é uma alternativa leve e eficiente. No debian, ele é empacotado em daemontools . Você também pode ler esta pergunta relacionada , que lista algumas críticas de supervisão e menciona restartd como outra possibilidade.

Finalmente, se você deseja algo incrivelmente fácil de configurar, tive grande sucesso com o monit . Também é empacotado no Debian .

Francois G
fonte
2
daemontools é incrível; monit é um pesadelo de "por que diabos você não começa?!?" frustração.
Womble
2

supervisionar ou monitorar são bons para manter vivo um único processo. Como você solicita manter "um ou mais" processos ativos, eu gostaria de conectar a supervisord . Certamente é um exagero gerenciar um único processo, mas se você precisar acompanhar vários processos, pode ser sua opção.

Bittrance
fonte
2

Uma opção é usar em /etc/inittabvez de inserir o script /etc/init.d/.

Você simplesmente adiciona uma entrada no seguinte formato:

<jobname>:<runlevels>:respawn:<command>

Infelizmente, isso significa que você não pode usar os comandos normais de iniciar / parar / reiniciar o init, mas deve garantir que seu script esteja sendo executado o tempo todo.

Alex
fonte
2

A maneira de distribuição cruzada de lidar com o processo é reiniciada com cron e um script simples. Você pode ver um artigo aqui Como manter um trabalho em execução no Linux

O script parece algo como

#!/bin/bash 
# make-run.sh 
# make sure a process is always running.  
# Add the following to the crontab (i.e. crontab -e)
# */5 * * * * /home/path_to_make_run/make-run.sh

process=servermonitoringhq 
makerun="/home/path_to_the_job_you_want_running/runjob.sh"  

if pgrep $process > /dev/null         
then                 
  exit         
else         
  $makerun &         
fi 
Ian Purton
fonte