在容器中使用shell脚本启动的进程如何优雅关闭?
直接运行java程序
假设我们在容器中直接启动的是我们的程序,例如java -jar xxx.jar
。如果执行docker stop <container>
,则意味着调用了kill -15 1
。
对于java程序而言,它会接收到SIGTERM
信号,Runtime的ShutdownHook钩子将会被回调。像spring这样的框架,都会把自己加入到ShutdownHook回调中,在回调中执行destroy、close等生命周期操作。
所以说如果只是执行kill -15 PID
命令,java程序是可以优雅的关闭。但同时我们也能看出,如果在ShutdownHook钩子中执行很耗时的操作,那么执行这个命令短时间内也不会停止java程序。所以在ShutdownHook中尽量不要做耗时长的操作,而是应该处理一些IO关闭、缓存刷新的操作。