Reiniciando o processo no CentOS se o servidor reiniciar

1

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

Os processos que eu executo são iniciados por

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

com todos os quatro startlançadores feitos por "Play" e localizados em pastas diferentes (dentro /opt).

Cada vez que o iPage reinicia o meu VPS, todas as quatro pastas mantêm o arquivo 'RUNNING_PID' com o antigo PID, então eu tenho que excluir manualmente esses arquivos para poder colocá-los novamente.

Eu estava checando esta resposta de uma pergunta relativamente semelhante ( como eu escrevo um script bash para reiniciar um processo se ele morrer? ) (Sem especificação de porta e nohupestilo, eu acho) sem sucesso.

Isto é o que eu fiz até agora:

  • Criou um tryRebootarquivo (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
    
  • Adicionado @reboot /opt/myJavaApp9000/tryRebootao crontabarquivo usandocrontab -e

Após reiniciar o servidor (via iPage Reboot), todos os quatro mantiveram seus RUNNING_PIDarquivos, mas nenhum deles foi reiniciado. Qual poderia ser o problema?

FranciscoBouza
fonte

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]; donão deve ter os colchetes [e ].
  • Se você tem .(o diretório atual) em seu caminho de pesquisa, não precisa dizer ./quando executa o startprograma da maneira que faz agora. Se você não tem .em seu caminho de busca, você não precisa dizer ./startem seu tryRebootscript.
  • Seu tryRebootscript não pode estar sendo executado crontabpor vários motivos. Por exemplo, correndo o risco de insultar sua inteligência, você não diz que fez chmod +x tryReboot. Você verificou que tryRebootestá sendo executado? Talvez fazendo com que ele escreva mensagens em um arquivo de log? Dica: você pode incluir a data e a hora nessas mensagens, incluindo $(date)sua echostring.
  • Os RUNNING_PIDarquivos podem persistir porque não há mecanismo para removê-los. (Se você disse como espera que eles sejam removidos, eu perdi.) Você provavelmente deve excluir o RUNNING_PIDarquivo no início do tryRebootscript; e, de fato, provavelmente em cada iteração (porque, se você chegar à echoinstrução, isso significa que o startcomando foi finalizado).

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

  • É starto nome do seu programa e você está realmente iniciando-o com um comando como , ou é um programa que bifurca e executa seu programa em um processo filho assíncrono? Neste último caso, toda a abordagem é inadequada.nohup ./start -Dhttp.port=port_number &startuntil command; do … done
  • Você já tentou executar tryRebootmanualmente? O que acontece?

Etc.

G-Man
fonte
Obrigado pela sua resposta! Eu já tinha feito chmod +x tryReboot, mas não tinha percebido que o script não estava sendo executado. Quando eu faço ./tryRebootisso diz "./tryReboot: linha 4: erro de sintaxe próximo ao token inesperado 'pronto' ./tryReboot: linha 4: 'pronto'" ... Tornou o tryRebootmais simples e colocou: até o início; echo "O servidor 'myserver' travou com o código de saída $ ?. Respawning .."> & 2 sleep 5 done Sem nenhuma alteração. Quanto às suas outras perguntas, start é o lançador dos aplicativos Java que eu fiz (essa é a maneira Reproduzir Framework faz isso): S
FranciscoBouza
0

Considere usar o monit . Ele foi projetado especificamente para esta tarefa. Não há necessidade de reinventar a roda.

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

RJ
fonte