【问题标题】:How do you gracefully shutdown a Java service from a Bash shell script?如何从 Bash shell 脚本优雅地关闭 Java 服务?
【发布时间】:2013-12-17 21:42:53
【问题描述】:

我正在将 Java REST 服务从“传统”方式(作为部署到多租户应用程序服务器 (Tomcat) 的符合 servlet 的 .war)转换为更简单的嵌入式设置,其中有一个简单的启动嵌入式 http 服务器 (Grizzly+Jersey) 的 Java 主类。缺少的一个部分是服务包装器。我可以通过执行 'java -jar myservice.jar' 手动运行该服务,但我想实现为适当的 Linux 后台服务。

通常,这是通过您放入 /etc/init.d 的简单 Bash shell 脚本来完成的。我见过一些超级简单的例子,但是它们通过进程终止而不是优雅的关闭来实现关闭。我还看到了一些商业工具来处理这个问题,但是这个任务似乎太简单了,无法涉及商业工具。

我的第一个猜测是在第二个端口上添加一个单独的超级简单 REST 服务,该服务侦听关闭请求并让 /etc/init.d Bash shell 脚本以这种方式发送关闭请求。

对于这个问题有更好或更标准的解决方案吗?

【问题讨论】:

    标签: java linux web-services bash daemon


    【解决方案1】:

    kill 是可以的(如果不是 kill -9),你应该只实现关闭挂钩来优雅地停止一切

    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    
            @Override
            public void run() {
                //TODO stop web server and close db connection if needed
    
            }
        }));
    

    【讨论】:

      【解决方案2】:

      使用控制套接字是处理 Unix 服务正常关闭的标准方法,这些服务需要的不仅仅是信号(例如,数据库)。他们中的许多人使用 Unix 域套接字,但使用 HTTP 来处理这类事情变得很普遍。您可能会考虑另一个具有受控访问的 HTTP URL(通过绑定到不同的套接字或通过编写逻辑来控制谁可以调用它)或 Java RMI。两者都没有压倒性的优势。

      请注意,您所做的任何事情可能都不会是“REST”,也不一定是;您将运行一个远程过程调用。

      【讨论】:

        【解决方案3】:

        这个问题有更好或更标准的解决方案吗?

        如果您不想监听 HTTP 调用或编写自己的使用套接字的代码,您可以使用 Apache commons-daemon。在这里查看答案:How to convert a java program to daemon with jsvc?

        还有JSWYAJSW 相似。

        【讨论】:

          猜你喜欢
          • 2016-06-17
          • 2011-12-12
          • 1970-01-01
          • 2010-09-06
          • 2019-07-25
          • 1970-01-01
          • 2021-01-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多