如何使进程监视程序,以便在程序退出时重新启动它

时间:2014-09-10 12:06:36

标签: java watchdog

所以我有我的节目,但我不希望它能够被关闭。我知道它不可能100%无法使用,但这种方法看起来效果最好。

我意识到你可以addShutdownHook,但是如果使用任务管理器(Windows)或kill -9(Unix)从操作系统中杀死进程,这将无效。显然,如果我有第二个进程正在运行并且主要进程被终止,它可以再次重新运行主进程,这使得它更可靠。

所以,我想知道如何在Java中创建一个watchdog process来监视我的实际Java应用程序以检测它是否已经关闭,然后如果它已经关闭它会重新执行该程序。

2 个答案:

答案 0 :(得分:1)

  1. 您的应用程序可以定期更新文件。看门狗可以检查该文件最近是否已更新;如果没有,监视器会断定应用程序已经退出,并重新启动它。应用程序可以在单独的daemon thread中进行更新,以确保无论应用程序负载如何都进行更新。这可以使用标准Java来完成,因此非常便携。

  2. 另一个选项是应用程序在find its own process ID (PID)开始运行时将其写入文件。监视程序读取该文件以查找应用程序的PID。然后,它可以定期检查list of running processes以检查应用程序是否仍在其中。这更复杂并且使用一些非可移植代码。但是可以使它更好地与在Unix计算机上启动和停止应用程序作为守护程序的传统方式集成,因为这样的守护进程通常会将它们的PID写入文件中。

  3. 您已指定监视程序必须使用Java。如果你在Unix上运行它并且你愿意把它写成shell脚本it can be written very easilly,并且这种方式可以避免使用PID文件和扫描进程列表的问题。

答案 1 :(得分:1)

根据退出代码逻辑创建一个包装“bouncer”脚本/应用程序。根据需要使其为正面或负面。

以下Bash示例假定应用程序在存在42状态时应重新启动。

#!/bin/bash

code=42
while (( code == 42 )); do
  myapp
  code=$?
done

可以使用ProcessBuilder

在Java中完成相同的包装器