【发布时间】:2011-02-02 12:16:12
【问题描述】:
我正在使用定制的 shell 脚本在 linux 机器上将 java 应用程序作为守护进程运行。
由于我是 java 和 linux 的新手,我想知道应用程序本身是否有可能复活(就像重新启动一样)并从应用程序崩溃、未处理的异常或内存不足等情况中恢复。
提前致谢
阿什·夏尔马
【问题讨论】:
我正在使用定制的 shell 脚本在 linux 机器上将 java 应用程序作为守护进程运行。
由于我是 java 和 linux 的新手,我想知道应用程序本身是否有可能复活(就像重新启动一样)并从应用程序崩溃、未处理的异常或内存不足等情况中恢复。
提前致谢
阿什·夏尔马
【问题讨论】:
在基于 unix 的系统上,您可以使用“inittab”来指定程序。如果进程死了,它会被操作系统重新启动。(respawn)
【讨论】:
说实话,在崩溃后毫无问题地重新启动守护进程可能不是一个好主意;好吧,这在很大程度上取决于您的守护程序实现的处理类型,但是如果它处理来自给定目录的文件,或者来自队列管理器的请求,并且文件/消息包含一些导致崩溃的意外数据,则重新启动守护程序会使它立即再次崩溃(除非文件/消息被删除,无论它是否被正确处理,但这似乎也不是一个好主意)。
简而言之,最好找出可能的崩溃原因并在可能的情况下修复它们(或者至少记录问题并继续,前提是要扫描日志消息以最终警告人类,因此可以针对此类“失败”采取一些措施)。
无论如何,如果您有充分的理由这样做,比“检查进程是否存在”更简单的解决方案(因为它可能在某种程度上涉及一些“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
【讨论】:
有一些 Wrappers 可以处理这个问题,比如 Java Service Wrapper(请注意,社区版是 GPL 下的)和一些替代方案,提到了 here
【讨论】:
JVM 设计为在出现不可恢复的错误时终止。您描述的属于这一类。
但是,您可以轻松编写一个 shell 脚本或 Python 脚本来检查进程是否处于活动状态,如果它已死,则等待几秒钟并恢复它。作为这样做的提示,Unix 命令“pgrep”是您的朋友,因为您可以检查用于触发 JVM 的确切命令行(因此包括起始类文件)。这样,您可以确定该特定 JVM 实例是否正在运行,然后重新启动它。
话虽如此,您可能希望添加一些报告或日志记录功能并经常检查,因为很容易假设一切正常,而实际上守护程序每隔几分钟就会死掉一次。在复活它之前,确保你已经尽你所能防止它死亡。
【讨论】:
我不确定应用程序本身是否可以处理此类崩溃。您可以在 linux 中编写一个 shell 脚本,它可以作为 cron 作业本身运行来管理应用程序,检查 java 应用程序是否按预定时间间隔运行,如果没有,它将自动重新启动。
【讨论】: