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.