Como fazer com que o script de shell reinicie Java se algum encadeamento falhar? [fechadas]

0

Eu tenho um programa Java multi-threaded.

Idealmente, ele deve ser executado uma vez e terminar com sucesso.

Infelizmente, às vezes um dos travamentos, como jogar DivisionByZeroException .

Como o programa é inútil, a menos que todas as threads estejam em execução, eu gostaria de reiniciar completamente a JVM (e o programa) sempre que um dos threads estiver inativo.

Pergunta: Como faço para escrever um script de shell que faria isso?

O pseudo código para o shell script que estou procurando é:

#bin/bash
while (true) {
   sudo java -jar MyProgram.jar
   if (MyProgram.terminatedWithoutExceptions) { // How to write this part?
       finish;
   } else {
       shutdown JVM;
   }
}
    
por mercury0114 09.02.2016 / 17:32

1 resposta

2

Um dos relacionamentos mais básicos entre um programa e o shell pai é o conceito de um "código de saída". Este é um inteiro simples que - por convenção - permite ao shell saber que houve um problema.

Zero é "tudo correu bem", qualquer outra coisa é "omghoustonproblems". Novamente, isso é apenas uma convenção. Algumas coisas (por exemplo, grep -q ... ) usam o código de saída para indicar se houve uma correspondência. Grep correu sem erro, mas está usando o código de saída para sinalizar outra coisa aqui.

De qualquer forma, presumo que se o seu aplicativo Java explodir a ponto de ser segmentado, ou qualquer outra coisa, ele não sairá corretamente. Então, por extensão, o código de saída que ele envia de volta ao shell pai não é zero. Isso facilita muito o teste:

while true; do
    sudo java -jar MyProgram.jar
    if [ $? -eq 0 ]; then
        // it exited cleanly, do something good
    else
        // it crashed out, do something else
    fi
done

Se você quiser sair do loop while em um desses lados da cláusula if, insira um break .

A execução do programa Java como root é realmente uma ótima ideia? Quem sabe. Eu não sei quem é esse roteiro externo, então não faça nenhum julgamento, mas considere refatorá-lo se puder.

O que precede é preciso, mas releitura de sua pergunta, você pode querer mudar o modo de agrupar seus tópicos. Já faz 13 anos desde que eu fiz qualquer trabalho de segmentação em Java e isso foi apenas acadêmico, mas várias coisas me ocorreram:

  • Problemas de divisão por zero são evitáveis ao validar entradas.
  • Eles também são acessíveis. Não deixe que eles quebrem o fio. Pegue, registre e siga em frente.
  • Um thread runner que permite que os threads travem sem iniciar um novo é um lixo. Encontre algo mais robusto.

A melhor solução não vai ser limpar quando as coisas derem errado, vai ser impedido de chegar tão longe em primeiro lugar. Isso pode ser feito.

    
por Oli 09.02.2016 / 18:18