实际答案

实际答案

我们在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 处理程序无法运行

相关内容