Como reiniciar automaticamente um processo na reinicialização do servidor / saída do processo?

5

No meu servidor Ubuntu eu uso Deus para monitorar alguns processos / scripts Ruby, incluindo um sistema de Filas.

Deus automaticamente verifica quando um dos meus processos existe e o reinicia. Também controla o uso de memória e age corretamente quando condições específicas são acionadas. Hoje eu reiniciei o servidor e depois de um tempo eu percebi que minha fila não estava funcionando. Depois de uma verificação rápida, descobri que Deus não foi reiniciado após a reinicialização do servidor (suponho que deveria).

Qual é a melhor maneira de garantir que Deus (ou um processo genérico) seja reiniciado automaticamente na reinicialização do servidor ou quando o processo é eliminado por qualquer motivo?

O comando específico que eu uso para começar Deus é

god -c config
    
por Simone Carletti 25.07.2009 / 23:20

4 respostas

8

Várias opções aqui. Basta pular para o último parágrafo, se você quiser uma recomendação, em vez de ler sobre os outros também!

É fácil reinicializar na reinicialização: adicione-o a /etc/rc.local , que distribuições baseadas no Debian (e muitas outras) executam depois de tudo nos outros scripts de inicialização por padrão. Se god não cair no fundo em si, talvez seja necessário at & para o ned do comando da seguinte forma:

god -c config &

O acima não irá reiniciar o processo quando estiver morto. Você pode escrever um script nos loops infinitos, mas isso é confuso e causará problemas quando você realmente quiser que ele seja morto.

Você também pode criar seu próprio script de inicialização, modelado em /etc/init.d (e vinculado a /etc/rc.* ', o que lhe dará uma solução mais completa, pois você terá a facilidade de interromper / iniciar o serviço quando precisar , embora isso não inicie automaticamente o serviço para você sem algum script extra de sua parte.

Você pode adicioná-lo ao seu /etc/inittab e, em seguida, init gerenciará o processo para você, iniciando-o na inicialização e reiniciando-o se ele morrer. Parará mesmo de reiniciá-lo se morre frequentemente num curto espaço de tempo. Isso ainda não é perfeito.

Acho que a abordagem geralmente recomendada para o que você descreveu é daemontools ( link ) que também suporta o reinício do serviço se ele morrer. Este é um pouco mais de trabalho aqui do que usar uma entrada em /etc/initab , mas você vai acabar com um produto final muito mais limpo que deve fazer tudo o que você pediu em sua pergunta. daemontools deve ser encontrado nos repositórios de praticamente qualquer distribuição Linux.

    
por 25.07.2009 / 23:34
3

Se você garantir que o processo esteja sempre em execução, então o inittab é a maneira mais sensata de fazer isso, pois ele irá reiniciar o processo se ele morrer. No entanto, eu não faria dessa maneira como se estivesse falhando. Eu preferiria descobrir isso mais cedo ou mais tarde, pois meu código melhoraria e seria menos provável que eu tornasse a máquina instável.

Se você tiver acesso root, crie um script de inicialização em /etc/init.d e use update-rc.d para criar os links simbólicos corretos nos diretórios de nível de execução. Um script de exemplo seria parecido com

 #!/bin/bash
 ### BEGIN INIT INFO
 # Provides:          god
 # Required-Start:    $syslog
 # Required-Stop:     $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Runs the ruby god meta server.
 # Description:       Runs the ruby god meta server.
 ### END INIT INFO

 start_daemon () {

        nohup start-stop-daemon --start --quiet -m --pidfile /var/run/god.pid \
        --exec  god -- -c config 
        RETVAL=$?
 }

 stop_daemon () {
    start-stop-daemon --stop --quiet --oknodo -m --pidfile /var/run/god.pid 
    RETVAL=$?
 }


 case "$1" in 

 start)
 start_daemon
 ;;
 stop)
 stop_daemon
 ;;
 restart | reload | force-reload )
 stop_daemon
 start_daemon
 ;;
 esac

Se você é apenas um usuário normal, pode usar o cron para executar processos no momento da inicialização especificando a hora de início como @reboot

@reboot god -c config
    
por 25.07.2009 / 23:44
1

Você precisa escrever um script init.d para iniciar e parar de deus. Você pode usar qualquer script em /etc/init.d como exemplo. Chame seu novo script /etc/init.d/god. Você pode então correr

# update-rc.d god defaults

e deve certificar-se de que ele inicia e pára na inicialização e no encerramento do servidor. Você pode achar que já existe um script init.d para deus disponível na internet. Eu teria uma pesquisa rápida antes de você se sentar para escrever um.

    
por 25.07.2009 / 23:28
0

Para garantir que Deus o reinicie na inicialização, você vai querer adicioná-lo aos scripts init. Para fazer isso, escreva um script que aceite pelo menos iniciar como um parâmetro (para seguir os padrões, você teria que fazer um pouco mais do que isso) e cole em /etc/init.d/. Em seguida, adicione um link simbólico chamado S99 para / etc / rc [qualquer nível de execução para o qual o script comece].

Idealmente, para melhor seguir os padrões, copie /etc/init.d/skeleton para algum outro lugar em /etc/init.d/ e edite-o para ajustá-lo.

    
por 25.07.2009 / 23:31