2012-04-24 119 views
0

我有几个24/7全天候运行的java应用程序。我想编写另一个Java应用程序,它检查是否有任何应用程序崩溃。如果某个应用程序崩溃了,我想重新启动它。有没有解决方案?Java - 检查是否有另一个Java应用程序正在运行

+0

这听起来像是我的一项操作系统任务。你使用哪个系统(-s)? – DerMike 2012-04-24 07:08:21

回答

0

什么我能想到的是,当这个例外是,您可以定义在这些24/7运行的程序一个新的自定义异常,添加例外,在那里你可以认为发生碰撞块,然后调用另一个Java应用程序的一些方法由碰撞调用。

+0

...就像'main'一样。 – DerMike 2012-04-24 07:05:39

1

我看到一些方法,但应该有更好的方式来做到这一点:

  1. 如果你有在你运行的应用程序的控制,你可以让他们每个人听一个给定端口的机器上并回复对它的任何请求。然后,您可以简单地ping该端口以查看应用程序是否正在运行。

  2. 如果您自行启动应用程序,你可以存储他们的PID,然后检查是否与该PID的进程仍然活着。

  3. 每个应用程序都可以创建一个文件并定期更新它。然后,您的监控应用程序可以检查文件是否已更新。如果没有,那么应用程序已经死了。

+1

“Pinging a port”工作如果崩溃还会降低侦听端口的部分。您可能会遇到其他所有事件都已崩溃的情况(例如,挂在竞赛状态),只有港口听众高兴地回应乒乓。 – Torben 2012-04-24 10:21:10

0

您可以使用wmic实用程序。 像这样:Process proc = Runtime.getRuntime().exec("wmic.exe");

然后,您可以检查与您的java应用程序(javaw.exe)应用程序相关的不同参数。

+1

这将工作在Linux上? – Astaz3l 2012-04-24 07:05:07

+0

@ Astaz3l你应该问一下superuser.com ;-) – DerMike 2012-04-24 07:07:21

0

您或许可以使用(http://quartz-scheduler.org/)Quartz调度,或java.util.Timer中的API来唤醒的过程recurrently.and检查。有时候你运行这个过程,我相信你可以得到可以存储的PID或进程ID。 定期唤醒并调用shell sript来检查进程是否正在运行。如果没有,那么产卵使用调用Runtime.getRuntime()新工艺

0

如果你可以用一个简单的解决方案,应用程序必须从应用程序的核心功能更新内外部资源。如果外部资源暂时未更新,则知道应用程序的核心已停止。

如果您使用单独的线程来更新资源,您的核心功能将崩溃,但线程继续运行并且您什么也没有检测到。

外部资源可以是文件。在那里写下当前的时间戳。如果时间戳没有更新一段时间,那么应用程序崩溃。或者,如果您的显示器位于单独的计算机上以检测硬件崩溃(如果显示器与您的应用程序崩溃,则显示器将毫无用处),则可以写入网络套接字。

您的监视器必须知道Java进程的进程标识符,以便它可以杀死它并在需要时重新启动它。如果从shell脚本启动应用程序,则可以将进程标识符写入文件中。

有一个十亿美元的产业生产这种软件监视器。这不是一项微不足道的任务。

相关问题