首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果有线程崩溃,如何使shell脚本重新启动Java?

问如果有线程崩溃,如何使shell脚本重新启动Java?
EN

Ask Ubuntu用户
提问于 2016-02-09 16:32:51
回答 1查看 2K关注 0票数 2

我有一个多线程Java程序。

理想情况下,它应该运行一次并成功终止。

不幸的是,有时其中一个线程崩溃,比如抛出DivisionByZeroException。

由于程序是无用的,除非所有线程都在运行,所以每当其中一个线程关闭时,我希望完全重新启动JVM (和程序)。

问:我如何编写一个shell脚本来完成这个任务?

我正在寻找的shell脚本的伪代码是:

代码语言:javascript
复制
#bin/bash
while (true) {
   sudo java -jar MyProgram.jar
   if (MyProgram.terminatedWithoutExceptions) { // How to write this part?
       finish;
   } else {
       shutdown JVM;
   }
}
EN

回答 1

Ask Ubuntu用户

发布于 2016-02-09 17:18:04

程序和父shell之间最基本的关系之一是“退出代码”的概念。这是一个-by约定的简单整数--让shell知道存在问题。

零是“一切顺利”,其他一切都是“不祥之兆”。再说一次,这只是一个惯例。有些事情(如grep -q ...)使用退出代码来指示是否有匹配。Grep运行时没有出错,但它使用退出代码在这里发出其他信号。

不管怎么说,如果您的Java应用程序爆炸到了分段错误的程度,或者其他什么问题,那么它就不会干净地退出。因此,通过扩展,它发送给父shell的退出代码不是零。这使得测试变得非常容易:

代码语言:javascript
复制
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做任何线程处理工作了,这只是学术上的,但我想到了一些事情:

  • 通过验证输入可以避免除以零的问题.
  • 它们也是可抓的。别让他们弄坏了线。抓住,记录,然后继续前进。
  • 让线程崩溃而不启动新线程的线程运行程序是垃圾。找些更强壮的东西。

最好的解决办法不是在事情出问题的时候清理,而是首先阻止他们走那么远。这是可以做到的。

票数 3
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/731685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档