如何从bashshell脚本优雅地关闭Java服务?

如何从bashshell脚本优雅地关闭Java服务?,java,linux,web-services,bash,daemon,Java,Linux,Web Services,Bash,Daemon,我正在将Java REST服务从“传统”的方式(作为一个与servlet兼容的.war部署到多租户应用服务器(Tomcat))转换为一个更简单的嵌入式设置,其中有一个简单的Java主类启动嵌入式http服务器(Grizzly+Jersey)。缺少的一部分是服务包装器。我可以通过执行“java-jarmyservice.jar”手动运行该服务,但我希望将其实现为一个合适的Linux后台服务 通常,这是通过放在/etc/init.d中的简单bashshell脚本完成的。我见过一些非常简单的例子,但它

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

通常,这是通过放在/etc/init.d中的简单bashshell脚本完成的。我见过一些非常简单的例子,但它们通过进程终止而不是优雅的关闭来实现关闭。我也见过一些商业工具来处理这个问题,但这个任务似乎太简单了,不需要商业工具

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


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

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

请注意,无论你在做什么,都可能不是“休息”,也不需要休息;您将要运行一个远程过程调用。

kill是可以的(如果不是kill-9),您应该只实现shutdownhook来优雅地停止所有操作

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

        @Override
        public void run() {
            //TODO stop web server and close db connection if needed

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

如果您不想侦听HTTP调用或编写自己的使用套接字的代码,可以使用ApacheCommons守护程序。请看下面的答案:

也有类似的和