它们是关闭Spring应用程序的多种方法。一种是在上调用close()ApplicationContext
:
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
您的问题建议您通过执行来关闭您的应用程序Ctrl+C
,这通常用于终止命令。在这种情况下...
使用endpoints.shutdown.enabled=true
不是最好的食谱。这意味着您需要公开一个端点来终止您的应用程序。因此,根据您的用例和环境,您必须对其进行保护...
Ctrl+C
应该适合您的情况。我认为您的问题是由&号引起的。
Spring Application Context可能已经向JVM运行时注册了一个关闭挂钩。请参阅ApplicationContext文档。
我不知道Spring Boot是否像您所说的那样自动配置了这个钩子。我认为是。
在上Ctrl+C
,您的外壳将INT
信号发送到前台应用程序。这意味着“请中断您的执行”。应用程序可以捕获该信号并在其终止(由Spring注册的钩子)之前进行清理,或者干脆忽略它(错误)。
nohup
是使用陷阱执行以下程序以忽略HUP信号的命令。当您挂断电话时,HUP用于终止程序(例如,关闭ssh连接)。此外,它重定向输出,以避免您的程序在消失的TTY上阻塞。nohup
不忽略INT信号。所以它不能阻止Ctrl+C
工作。
我认为您的问题是由&号引起的,而不是由nohup引起的。Ctrl+C
向前台进程发送信号。“&”号使您的应用程序在后台运行。一种解决方案:做
kill -INT pid
使用kill -9
或kill -KILL
不好,因为应用程序(在此为JVM)无法捕获它以正常终止。
另一个解决方案是使应用程序恢复到前台。然后Ctrl+C
将工作。看一下Bash Job控制,更确切地说看fg
。