Reiniciando processo no CentOS se o servidor for reiniciado

1

Eu tenho um VPS com alguns aplicativos Java (feitos com o "Play Framework") nas portas 9000, 9001, 9002 e 9003. O VPS Provider (iPage) por acaso reinicia os servidores inesperadamente de tempos em tempos, deixando os quatro processos inativos .

Os processos que eu executo são lançados por

  • nohup ./start -Dhttp.port=9000 ,
  • nohup ./start -Dhttp.port=9001 ,
  • nohup ./start -Dhttp.port=9002 e
  • nohup ./start -Dhttp.port=9003

com todos os quatro start lançadores criados por "Play" e localizados em pastas diferentes (dentro de /opt ).

Cada vez que o iPage reinicia o meu VPS, todas as quatro pastas mantêm o seu ficheiro 'RUNNING_PID' com o seu antigo PID, pelo que tenho de eliminar manualmente esses ficheiros para poder voltar a colocá-los.

Eu estava checando esta resposta de uma pergunta relativamente semelhante ( Como eu escrevo um script bash para reiniciar um processo se ele morrer? ) (sem especificar porta e nohup style, eu acho) sem sucesso.

Isso é o que eu fiz até agora:

  • Feito um arquivo tryReboot (salvo em /opt/myJavaApp9000/ ) com o seguinte conteúdo:

    until start -Dhttp.port=9000; do
        echo "9000 process crashed with exit code $?.  Respawning.." >&2
        sleep 1
    done
    
  • Adicionou @reboot /opt/myJavaApp9000/tryReboot ao arquivo crontab usando crontab -e

Após a reinicialização do servidor (através do iPage Reboot), todos os quatro mantiveram seus arquivos RUNNING_PID , mas nenhum deles foi reiniciado. Qual poderia ser o problema?

    
por FranciscoBouza 20.10.2014 / 18:02

2 respostas

0

Qual poderia ser o problema? Aqui estão algumas possibilidades:

  • Releia a resposta a que você se refere. until [start -Dhttp.port=9000]; do não deve ter os colchetes [ e ] .
  • Se você tiver . (o diretório atual) em seu caminho de pesquisa, você não precisa dizer ./ quando executar seu programa start da maneira que você faz agora. Se você não tiver . em seu caminho de pesquisa, você fazer precisa dizer ./start no seu script tryReboot .
  • Seu script tryReboot pode não estar em execução em crontab por vários motivos. Por exemplo, correndo o risco de insultar sua inteligência, você não diz que você fez chmod +x tryReboot . Você verificou que tryReboot está sendo executado? Talvez por ter escrito mensagens em um arquivo de log? Dica: você pode querer incluir a data e o horário nessas mensagens incluindo $(date) na sua string echo .
  • Os arquivos RUNNING_PID podem persistir porque não há mecanismo para removê-los. (Se você disse que espera que eles sejam removidos, eu perdi isso.) Você provavelmente deve excluir o arquivo RUNNING_PID no início do script tryReboot ; e, de fato, provavelmente em cada iteração (porque, se você chegar à instrução echo , isso significa que o comando start foi finalizado).

Mas é difícil dizer qual é o problema, porque sua pergunta é um pouco incerta.

  • É start o nome do seu programa e você está realmente lançando com um comando como nohup ./start -Dhttp.port=port_number & , ou é start um programa que bifurca e executa seu programa em um processo filho assíncrono? Se esta última, toda a abordagem until command; do … done é inadequada.
  • Você já tentou executar tryReboot manualmente? O que acontece?

Etc.

    
por 20.10.2014 / 19:08
0

Considere o uso de monit . Ele é projetado especificamente para essa tarefa. Não há necessidade de reinventar a roda.

simplesmente edite o / etc / monit / monitrc, adicione o caminho para o seu script e pronto.

    
por 21.10.2014 / 03:44