如何通过start-stop-daemon优雅地关闭Spring Boot应用程序[重复]
Posted
技术标签:
【中文标题】如何通过start-stop-daemon优雅地关闭Spring Boot应用程序[重复]【英文标题】:How to gracefuly shutdown a Spring Boot application by start-stop-daemon [duplicate] 【发布时间】:2016-08-10 00:51:58 【问题描述】:我们有一个多线程 Spring Boot 应用程序,它作为守护进程在 Linux 机器上运行。当我尝试像这样通过 start-stop-daemon 停止应用程序时
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
发送 SIGTERM 信号,应用程序立即结束。但是我希望应用程序等待,直到每个线程完成它的工作。
当收到 SIGTERM 信号时,有什么办法,如何管理发生的事情?
【问题讨论】:
如果您有兴趣优雅地关闭嵌入式 servlet 容器,请参阅this Spring Boot issue。 这能回答你的问题吗? Does spring have a shutdown process to put cleanup code? 【参考方案1】:Spring Boot 应用向 JVM 注册了一个关闭挂钩,以确保 ApplicationContext
在退出时正常关闭。创建实现DisposableBean
或具有带有@PreDestroy
注释的方法的bean(或bean)。此 bean 将在应用关闭时调用。
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-application-exit
【讨论】:
感谢您的提示。但是,这并不能解决我的问题,因为我需要以某种方式拦截 SIGTERM 信号并等到应用程序完成它的工作。这允许我进行一些清理,但如果我理解正确,这不允许我阻止当前正在运行的方法的终止。 @Michal 你是对的,它不允许你阻止终止。但它允许实现线程停止逻辑并等待线程完成。如果关闭钩子起作用,JVM 将不会被终止。 应该注意的是,Spring 不推荐使用DisposableBean
,“...因为它不必要地将代码耦合到 Spring。” [docs.spring.io/spring/docs/current/spring-framework-reference/… 最好改用@PreDestroy
。【参考方案2】:
@Evgeny 提到的示例
@SpringBootApplication
@Slf4j
public class SpringBootShutdownHookApplication
public static void main(String[] args)
SpringApplication.run(SpringBootShutdownHookApplication.class, args);
@PreDestroy
public void onExit()
log.info("###STOPing###");
try
Thread.sleep(5 * 1000);
catch (InterruptedException e)
log.error("", e);;
log.info("###STOP FROM THE LIFECYCLE###");
【讨论】:
以上是关于如何通过start-stop-daemon优雅地关闭Spring Boot应用程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章
什么是 linux 脚本中的 start-stop-daemon?
如何记录由 start-stop-daemon 启动的进程的标准输出?