为什么有时需要通过kill -9来停止进程

耶尔

我们在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
}
布赖登·吉布森(Brydon Gibson)

默认情况下,向进程发送标准kill会发送(根据维基百科)SIGTERM。这样做是通知该进程应关闭。这是处理流程的好方法,它像这样:

  • 处理寄存器信号换为SIGTERM
  • 你想杀死这个过程
  • 您通过杀死发送SIGTERM
  • 信号处理程序被称为,这是过程进行的机会
    • 关闭它已打开的文件
    • 写出任何缓冲区
    • 关闭所有子线程

发送强制流程退出的SIGTERM没有任何作用。它可以完全忽略它,也可以根据需要运行。

Kill -9发送SIGKILL。您无权为SIGKILL注册处理程序,这意味着将调用默认处理程序(我相信内核空间-有人在这里纠正我)。在这种情况下,您没有机会执行上述操作,您的进程会立即从可运行的进程列表中删除,并且其内存和所有内容都将被销毁。如果您正在写文件的一半,这显然会引起问题。

一些进程在关闭之前会采用多个SIGTERM信号-您是否尝试过?该过程可能还会记录您可以发送哪些信号以将其彻底关闭。

处于不良状态的进程即使已注册,也可能没有机会进入信号处理程序。在某些点上无法接收到信号(您正在中断中,或者已经在处理另一个信号,还有一些我目前无法确定)。如果您的进程由于某种原因而卡在了其中(无论出于何种原因),无论发送多少次,SIGTERM处理程序都将永远不会运行。唯一的解决方案是SIGKILL,但是我什至看到了忽略该信号的情况,在这种情况下,必须重新启动系统。

实际答案

要回答您的问题-在哪种情况下,忽略杀死并坚持用-9杀死:

  • 该进程已经注册了一个SIGTERM处理程序,该处理程序专门不会终止该进程(注意-默认SIGTERM将终止该进程)
  • 进程陷入信号阻塞状态,无法运行SIGTERM处理程序

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么“尝试/捕获”中的命令有时需要-ErrorAction停止,而有时则不需要?

来自分类Dev

为什么后台进程有时会自发停止?

来自分类Dev

为什么来自子进程的管道有时会中断,有时不会?

来自分类Dev

为什么有时我需要刷新网页才能看到我从 api 检索到的数据出现在我的表上?角 9

来自分类Dev

为什么分叉的进程有时在ps的名称旁出现方括号[]?

来自分类Dev

为什么`bash -c somecommand`有时不离开bash进程?

来自分类Dev

为什么在具有docker-compose的Docker容器中,Python进程的父pid有时有时为0?

来自分类Dev

Linux通过kill + PID停止后台进程

来自分类Java

为什么可以通过在测试时添加@SpringBootApplication来解决为什么需要“ outputChannelName”或“ outputChannelName”异常的问题

来自分类Dev

在Rust中,当您需要一个引用持有结构来有时拥有其引用数据时的模式是什么?

来自分类Python

它有效,但是为什么需要通过减去1来更改索引

来自分类Dev

为什么Visualforce页面需要无效的HTML?(有时)

来自分类Dev

为什么有时需要外部包装箱?

来自分类Dev

为什么OCaml有时需要eta扩展?

来自分类Dev

为什么有时在元字符周围需要空格?

来自分类Dev

为什么在Ruby中有时需要加括号?

来自分类Dev

通过Powershell关闭时无法停止所有Excel进程

来自分类Dev

为什么 SIGINT 不终止停止的进程?

来自分类Dev

为什么有时有时需要手动重启路由器?

来自分类Dev

为什么有时有时需要手动导入密钥?

来自分类Dev

通过javascript从端口停止进程

来自分类Dev

为什么我有时需要使用JSON.stringify而有时不需要

来自分类Dev

为什么在 Rails 中有时我需要一个包,有时我不需要?

来自分类Dev

有时,通过改造来检索数据时,我的ap崩溃:D / AndroidRuntime:关闭VM?

来自分类Linux

为什么kill -2无法杀死进程?

来自分类Dev

为什么close_fds = False有时会在Python 2中挂起进程?

来自分类Dev

为什么切片有时通过引用传递,有时通过指针传递?

来自分类Dev

为什么在双叉中需要等待来删除僵尸进程?

来自分类Dev

如何杀死由kill或kill -9脚本开始的进程产生的所有子进程

Related 相关文章

  1. 1

    为什么“尝试/捕获”中的命令有时需要-ErrorAction停止,而有时则不需要?

  2. 2

    为什么后台进程有时会自发停止?

  3. 3

    为什么来自子进程的管道有时会中断,有时不会?

  4. 4

    为什么有时我需要刷新网页才能看到我从 api 检索到的数据出现在我的表上?角 9

  5. 5

    为什么分叉的进程有时在ps的名称旁出现方括号[]?

  6. 6

    为什么`bash -c somecommand`有时不离开bash进程?

  7. 7

    为什么在具有docker-compose的Docker容器中,Python进程的父pid有时有时为0?

  8. 8

    Linux通过kill + PID停止后台进程

  9. 9

    为什么可以通过在测试时添加@SpringBootApplication来解决为什么需要“ outputChannelName”或“ outputChannelName”异常的问题

  10. 10

    在Rust中,当您需要一个引用持有结构来有时拥有其引用数据时的模式是什么?

  11. 11

    它有效,但是为什么需要通过减去1来更改索引

  12. 12

    为什么Visualforce页面需要无效的HTML?(有时)

  13. 13

    为什么有时需要外部包装箱?

  14. 14

    为什么OCaml有时需要eta扩展?

  15. 15

    为什么有时在元字符周围需要空格?

  16. 16

    为什么在Ruby中有时需要加括号?

  17. 17

    通过Powershell关闭时无法停止所有Excel进程

  18. 18

    为什么 SIGINT 不终止停止的进程?

  19. 19

    为什么有时有时需要手动重启路由器?

  20. 20

    为什么有时有时需要手动导入密钥?

  21. 21

    通过javascript从端口停止进程

  22. 22

    为什么我有时需要使用JSON.stringify而有时不需要

  23. 23

    为什么在 Rails 中有时我需要一个包,有时我不需要?

  24. 24

    有时,通过改造来检索数据时,我的ap崩溃:D / AndroidRuntime:关闭VM?

  25. 25

    为什么kill -2无法杀死进程?

  26. 26

    为什么close_fds = False有时会在Python 2中挂起进程?

  27. 27

    为什么切片有时通过引用传递,有时通过指针传递?

  28. 28

    为什么在双叉中需要等待来删除僵尸进程?

  29. 29

    如何杀死由kill或kill -9脚本开始的进程产生的所有子进程

热门标签

归档