我尝试通过以下方式终止之前在 KUbuntu 下提交的所有后台作业:
kill -9 $(jobs -p)
虽然这个命令立即给出了如下信息
[1] 杀死myjob1
[2] 杀死myjob2
我仍然可以在 top 的输出中看到它们的进程挂起,并且在 uptime 和 free 的输出中 CPU 和内存使用率没有变化。
所以我想我肯定没有彻底杀死它们。有人能解释一下我发生了什么事以及我该怎么办吗?
我发现在 top 中,如果键入 k 并输入 PID,我可以逐个终止进程。那么这与命令 kill 有什么不同吗?
我也在网上找到了http://www.ruhr.de/home/smallo/award.html关于不推荐 kill -9
Kill -9 格式信件无用用法
(引述令人憎恶的话)
不不不。不要使用 kill -9。
它没有给这个过程一个机会来清理:
1)关闭套接字连接
2)清理临时文件
3)通知其子进程它将要离开
4)重置其终端特性
等等等等。
一般来说,发送 15,然后等待一两秒,如果不行,就发送 2,如果还不行,就发送 1。如果还不行,就删除该二进制文件,因为程序行为很糟糕!
不要使用kill -9。不要为了整理花盆而开出联合收割机。
这是真的吗?“发送 15”、“发送 2”和“发送 1”是什么意思?它们是命令本身还是“kill -15 PID”、“kill -2 PID”和“kill -1 PID”?
感谢致敬!
答案1
您的进程可能已经死亡,但它仍显示在进程表条目中,因为它是一个“僵尸进程”。当子进程终止并完全消失(除了其进程表条目)并且父进程无法获取其终止状态(通过任何等待函数)时,它被称为僵尸进程……通过信号杀死僵尸进程不起作用,因为它已经终止。您需要做的是找出它的父进程并彻底杀死它,因此不能使用 kill - 9
以下是杀死僵尸的两个简单步骤......
- 如果父进程还活着,尝试杀死它(或者你只需要 SIGHUP)
- 如果 1 号失败了,那么内核中就有 bug.... 重启可以帮助你修复 bug :->
答案2
请参阅man kill
可用各种信号的定义,但是是的。
这些信号通知进程,用户已“完成”该进程,尽管它们表明的原因略有不同。SIGTERM 可能被解释为“完成当前任务,然后退出;不要启动另一个任务”,SIGINT 表示“放弃你正在做的事情并退出”,SIGHUP 仅表示没有人再监听(服务器进程可能会合法地对 SIGHUP 做出反应,即停止其控制台输出并继续运行)。
- 9 是终止信号,并且它的特殊之处在于它是唯一一个进程无法捕获并在内部处理的异常。它只会导致内核永远不会将控制权归还给进程,从而没有机会进行清理。
答案3
它确实意味着使用kill -15 PID
(或另一个数字)代替kill -9 PID
。这些数字相当于不同的unix 信号。
答案4
信号 9 是 SIGKILL。发送 SIGKILL 表示要求操作系统立即终止进程,无需任何理由。进程不会提前收到通知,因此没有机会自行清理。
信号 15 是 SIGTERM。发送 SIGTERM 表示要求操作系统让进程自行关闭。
如果操作系统认为该进程正在进行 IO,或者它是一个僵尸进程(其父进程未清理其子进程),则 SIGKILL 可能会被忽略。
SIGTERM 可能会被应用程序忽略,但不建议应用程序这样做,因为操作系统在关机期间会发送 SIGTERM,如果程序仍在运行,则会立即发送 SIGKILL。
注意:命令行kill
始终要求操作系统向应用程序发送信号,根据谁拥有该进程等情况,操作系统可能会或可能不会发送该信号...