kill -9
我们正在就此进行内部讨论。在 RHEL 上运行 jboss eap 7。我们目前有一个脚本,只需在 java 进程上运行即可停止服务器。
我的建议是使用正确的 jboss 命令来关闭:
jboss-cli --connect --commands=:shutdown
我们如何确保 jboss 从 kill 中正常关闭?我坚持使用 jboss 命令。
答案1
如果软件不简单,并且有文档记录的关闭方法(就像这里的情况一样),那就采用它吧。(可能有多个选项。)
具体来说,对于SIGKILL
(signal 9
) 来说,它并没有什么优雅之处。
目标进程无法拦截和处理此信号;它只是立即终止,而没有完成它正在做的事情或进行它在关闭前通常会做的任何清理工作。
至于一般信号,如果目标是某种形式的正常关闭,则研究软件如何处理SIGTERM
和/或SIGINT
。软件至少可以考虑这些并正常关闭。
SIGKILL
当正常关闭服务不起作用时,应将其视为最后的手段。
答案2
假设每一个枪已装好子弹,每一个应用程序是signal 9 unsafe
。否则,您很可能会浪费大量时间来调试偶尔出现的故障,这些故障是由日志文件轮换期间发生的强制关机等简单事件引起的。
存在signal 9 safe
意味着将状态改变限制于原子事务,而很少有有状态的应用程序真正做到这一点。
在 Java 世界中,您无法避免偶尔终止卡住的程序。但关闭应用程序的主要方法应该是优雅的方法,并且每次通过该方法关闭失败都应该至少像软件堆栈中的任何其他错误一样受到严格审查。
答案3
根据 RedHat 官方文档,信号 SIGHUP、SIGINT 和 SIGTERM 会触发正常关机。SIGKILL(kill -9)则不会。