我们在hadoop集群中有kafka机器
停止 kafka 进程的脚本执行以下操作
杀死PID
但我们注意到停止 kafka 的脚本并没有真正杀死进程
因此我们通过以下方式(手动)杀死了它:
杀死-9 PID
所以 - 在这种情况下,进程坚持被 -9 杀死(而不是仅仅杀死 pid )
脚本中的示例
function kafkaKill {
local localPID=$1
kill $localPID || return 1
for ((i=0; i<MAX_WAIT_TIME; i++)); do
kafkaIsRunning $localPID
if [ $? -eq 0 ]; then return 0; fi
sleep 1
done
kill -s KILL $localPID || return 1
for ((i=0; i<MAX_WAIT_TIME; i++)); do
kafkaIsRunning $localPID
if [ $? -eq 0 ]; then return 0; fi
sleep 1
done
return 1
}
答案1
默认情况下,向进程发送标准终止会发送(根据维基百科)SIGTERM。其作用是通知进程它应该关闭。这是处理该过程的好方法,如下所示:
- 进程寄存器 SIGTERM 的信号处理程序
- 你想杀死这个进程
- 你通过 kill 发送 SIGTERM
- 信号处理程序被调用,这是进程的机会
- 关闭已打开的文件
- 写出所有缓冲区
- 关闭所有子线程
发送 SIGTERM 并不会强制进程退出。它可以完全忽略它,也可以随心所欲地行事。
Kill -9 发送 SIGKILL。您不允许为 SIGKILL 注册处理程序,这意味着调用默认处理程序(我相信是内核空间 - 有人在这里纠正我)。在这种情况下,您没有机会执行上述操作,您的进程将立即从可运行进程列表中删除,并且其内存和所有内容都将被销毁。如果您正在写入文件,这显然会导致问题。
有些进程在关闭之前会接受多个 SIGTERM 信号 - 您尝试过吗?该过程还可能记录您可以发送哪些信号以彻底关闭它。
处于不良状态的进程可能没有机会访问信号处理程序,即使它已注册信号处理程序。有些点无法接收信号(您处于中断状态,或者已经在处理另一个信号,以及其他一些我目前无法确定的信号)。如果您的进程陷入其中(无论出于何种原因),SIGTERM 处理程序将永远不会运行,无论您发送多少次。这里唯一的解决方案是 SIGKILL,但是我什至见过该信号被忽略的情况,在这种情况下需要重新启动系统。
实际答案
回答你的问题 - 在什么情况下会被忽略并坚持用 -9 杀死:
- 该进程已注册一个 SIGTERM 处理程序,该处理程序不会明确终止该进程(注意 - 默认 SIGTERM 将终止该进程)
- 进程陷入信号阻塞状态,SIGTERM 处理程序无法运行