我使用自定义的shell脚本在linux机器上运行Java应用程序作为守护程序。
由于我是java和linux的新手,我想知道应用程序本身是否有可能恢复自身(就像重启一样)并从应用程序崩溃,未处理的异常或内存不足等情况中恢复。
提前致谢
Ashish Sharma
答案 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应用程序是否按预定的时间间隔运行,如果没有,它将自动重启。