我有一个多线程Java程序。
理想情况下,它应该运行一次并成功终止。
不幸的是,有时其中一个线程崩溃,比如抛出DivisionByZeroException。
由于程序是无用的,除非所有线程都在运行,所以每当其中一个线程关闭时,我希望完全重新启动JVM (和程序)。
问:我如何编写一个shell脚本来完成这个任务?
我正在寻找的shell脚本的伪代码是:
#bin/bash
while (true) {
sudo java -jar MyProgram.jar
if (MyProgram.terminatedWithoutExceptions) { // How to write this part?
finish;
} else {
shutdown JVM;
}
}发布于 2016-02-09 17:18:04
程序和父shell之间最基本的关系之一是“退出代码”的概念。这是一个-by约定的简单整数--让shell知道存在问题。
零是“一切顺利”,其他一切都是“不祥之兆”。再说一次,这只是一个惯例。有些事情(如grep -q ...)使用退出代码来指示是否有匹配。Grep运行时没有出错,但它使用退出代码在这里发出其他信号。
不管怎么说,如果您的Java应用程序爆炸到了分段错误的程度,或者其他什么问题,那么它就不会干净地退出。因此,通过扩展,它发送给父shell的退出代码不是零。这使得测试变得非常容易:
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如果您想退出那些If子句边中的while-循环,请插入一个break。
将Java程序作为root运行真的是一个好主意吗?谁知道呢。我不知道这个外部脚本正在运行的是谁,所以在这一点上没有判断,但是如果可以的话,可以考虑重构它。
上面的内容是准确的,但重新阅读你的问题,你可能想改变你如何汇集你的线程。我已经13年没有用Java做任何线程处理工作了,这只是学术上的,但我想到了一些事情:
最好的解决办法不是在事情出问题的时候清理,而是首先阻止他们走那么远。这是可以做到的。
https://askubuntu.com/questions/731685
复制相似问题