如何通过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 启动的进程的标准输出?

start-stop-daemon

如何防止 start-stop-daemon 在 cronjob 中创建多个实例?

start-stop-daemon 在外部脚本条件下运行

关于 'start-stop-daemon' not found in PATH or not executable