【问题标题】:What is the best way to self-restart programmatically a java application under Ubuntu在Ubuntu下以编程方式自重启Java应用程序的最佳方法是什么
【发布时间】:2009-12-22 18:02:03
【问题描述】:

我有一个运行多个线程的应用程序。它们每个都用一个 cath(Throwable) 包裹,如果发生意外情况,我可以使用它。在 Ubuntu/Linux 下重新启动应用程序本身的最佳方法是什么。 我找到了这个项目“Java Service Wrapper”,有经验吗?

我尝试了 -XX:OnError 选项,但它似乎不起作用(Java(TM) SE Runtime Environment (build 1.6.0_16-b01))

【问题讨论】:

  • 如果出现问题,需要考虑重新启动线程。 Java 使用 AWT 线程自动执行此操作。
  • 顺便说一句,它是如何“包装”在 try catch 中的? .start() 是包装在 try/catch 中,还是整个 run() 方法?
  • run方法被包裹(正在运行的线程)

标签: java crash restart


【解决方案1】:

您能否从批处理文件(循环)启动它并让它使用 System.exit(1)?

如果是这样,您可以测试批处理文件中的错误级别,如果为 1,则循环返回并重新启动程序,但如果为 0,则退出批处理文件。

编辑: 您是否希望从外部触发“重置”(来自 unix?)

如果是这样,我的建议如下:

  1. 创建一个名为 -restart 的命令行选项
  2. 在没有命令行的情况下运行时,在预设的高端口(32123?)上打开一个套接字,并在启动应用时侦听连接。
  3. 当您获得一个带有传递给它的密钥字符串的连接时,执行 System.exit(1);
  4. 使用 -restart 运行时,连接到该端口并发送正确的密钥字符串并退出,而不是正常启动。
  5. 如果您的重启例程无法连接,请务必打印一条错误消息,说明守护程序未运行。

还有其他方法可以向现有进程发送消息,但套接字可能是最简单的——它只是几行代码。另一个是轮询某个文件在某个绝对位置是否存在,还有找到 PID 并杀死它。

套接字作为独立于平台的附加优势。

【讨论】:

    【解决方案2】:

    您必须设计一种机制来处理您的多个线程、捕获问题并确定您是否可以从 Java 内部重新启动失败的线程

    操作系统唯一重要的地方是您的应用程序是否完全退出并需要重新启动。只要您的应用程序有部分部分在运行,就不应考虑这一点。

    【讨论】:

    • 除非您想向应用发送套接字消息以使其自行重启。那么也许你会认为我考虑这个可能没问题?
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 2012-11-08
    • 1970-01-01
    • 2010-09-23
    • 2022-01-17
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多