【问题标题】:Restoring/Restarting a java daemon from crash从崩溃中恢复/重新启动 java 守护进程
【发布时间】:2011-02-02 12:16:12
【问题描述】:

我正在使用定制的 shell 脚本在 linux 机器上将 java 应用程序作为守护进程运行。

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

提前致谢

阿什·夏尔马

【问题讨论】:

    标签: java linux shell


    【解决方案1】:

    在基于 unix 的系统上,您可以使用“inittab”来指定程序。如果进程死了,它会被操作系统重新启动。(respawn)

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          JVM 设计为在出现不可恢复的错误时终止。您描述的属于这一类。

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

          话虽如此,您可能希望添加一些报告或日志记录功能并经常检查,因为很容易假设一切正常,而实际上守护程序每隔几分钟就会死掉一次。在复活它之前,确保你已经尽你所能防止它死亡。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 2014-01-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-22
              • 2013-01-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多