从崩溃中恢复/重启java守护进程

时间:2010-03-30 14:30:21

标签: java linux shell

我使用自定义的shell脚本在linux机器上运行Java应用程序作为守护程序。

由于我是java和linux的新手,我想知道应用程序本身是否有可能恢复自身(就像重启一样)并从应用程序崩溃,未处理的异常或内存不足等情况中恢复。

提前致谢

Ashish Sharma

5 个答案:

答案 0 :(得分:3)

JVM设计为在存在不可恢复的错误时死亡。你描述的那些属于这一类。

但是,您可以轻松编写一个shell脚本或一个Python脚本来检查进程是否处于活动状态,如果它已经死了,则等待几秒钟然后重新启动它。作为这样做的提示,Unix命令“pgrep”是你的朋友,因为你可以检查用于触发JVM的确切命令行(因此包括起始类文件)。这样,您可以确定该特定JVM实例是否正在运行,然后重新启动它。

所有这一切,您可能想要添加一些报告或日志记录功能并检查是否经常,因为实际上守护程序每隔几分钟就会死亡,这很容易让人觉得事情没问题。确保你已经尽力避免它在复活之前死亡。

答案 1 :(得分:3)

有一些Wrappers可以解决这个问题,比如Java Service Wrapper(请注意,社区版是在GPL下)和一些替代方案,提到here

答案 2 :(得分:2)

在基于unix的系统上,您可以使用“inittab”指定程序。如果进程死亡,则由OS重新启动。(重新生成)

答案 3 :(得分:2)

说实话,在崩溃后重新启动守护进程可能不是一个好主意;这很大程度上取决于守护程序实现的处理类型,但是如果它处理来自给定目录的文件,或来自队列管理器的请求,并且文件/消息包含导致崩溃的一些意外数据,则重新启动守护程序会立即再次崩溃(除非文件/消息被删除,无论它是否已被正确处理,但它似乎不是一个好主意)。

简而言之,最好跟踪可能的崩溃原因并在可能的情况下修复它们(或者至少记录问题并继续进行,前提是日志消息将被扫描以警告最后一个人,所以可以采取一些行动来解决这些“失败”。)

无论如何,如果你有充分的理由这样做,解决方案甚至比“检查进程是否存活”更简单(因为它可能在某种程度上涉及一些“ps -blahblah”的东西),你可以把java程序在shell中启动“while true”循环如下:

while true
do
  # launch the java program here, no background
  # when crashing, the shell will be given hand back
  java -classpath blahblah...
  echo "program crashed, relaunching it..."
done

答案 4 :(得分:1)

我不确定应用程序本身是否可以处理此类崩溃。您可以在linux中编写一个shell脚本,它可以作为一个cron作业运行来管理应用程序,检查java应用程序是否按预定的时间间隔运行,如果没有,它将自动重启。