如何从Bash shell脚本中正常closuresJava服务?

我将Java REST服务从“传统”方式转换成了一个简单的embedded式安装程序,作为一个兼容servlet的.war部署到多租户应用程序服务器(Tomcat) – 其中有一个简单的Java主类启动一个embedded式http服务器(Grizzly + Jersey)。 一个缺失的部分是服务包装。 我可以通过执行'java -jar myservice.jar'来手动运行服务,但是我想实现一个适当的Linux后台服务。

通常,这是通过一个简单的Bash shell脚本来完成的,该脚本放在/etc/init.d中。 我已经看到了一些超级简单的例子,但是它们通过进程kill来实现closures,而不是正常closures。 我也看到了一些商业工具来处理这个问题,但是这个任务似乎太简单了,不能涉及商业工具。

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

这个问题有更好或更多的标准解决scheme吗?

kill是可以的(如果不是kill -9),你应该只执行shutdown hook才能正常停止执行

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

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

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

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

如果您不想监听HTTP调用或编写自己的使用套接字的代码,则可以使用Apache commons-daemon。 在这里看到答案: 如何使用jsvc将java程序转换为守护进程?

也有类似的JSW和YAJSW 。