it-swarm.cn

我什么时候不应该取消-9进程?

我总是很犹豫地运行kill -9,但是我看到其他管理员几乎都在定期执行此操作。

我认为可能存在明智的中间立场,因此:

  1. 何时以及为什么应使用kill -9?什么时候,为什么不呢?
  2. 在做之前应该尝试什么?
  3. 什么样的调试“挂起”过程可能会引起更多问题?
405
Mikel

通常,应该在kill -s TERMkill -15)之前使用killkill -9的缩写,或者在大多数系统上是kill -s KILL)自己清理。 (进程不能捕获或忽略SIGKILL,但是它们可以并且经常捕获SIGTERM。)如果您不给进程机会来完成它的工作并清理,可能会留下损坏的文件(或其他状态),使其重新启动后将无法理解。

strace/_trussltracegdb通常是了解为什么卡住的进程被卡住的好主意。 (Solaris上的truss -u特别有用;我发现ltrace经常以无法使用的格式提供参数给库调用。)Solaris还具有基于/proc的有用工具,其中一些工具具有已移植到Linux。 (pstack通常很有帮助)。

366
geekosaur

兰德尔·施瓦兹(Randal Schwartz)经常在列表上张贴“(x)的无用”。其中一篇有关kill -9。它包括原因和遵循的食谱。 这里是重建的版本 (在下面引用)。

(可憎行情)

不不不。不要使用kill -9。

它并没有给过程一个干净的机会:

1)关闭插座连接

2)清理临时文件

3)告知其孩子将要消失

4)重置其终端特性

等等,依此类推。

通常,发送15,然后等待一两秒钟,如果不起作用,则发送2,如果不起作用,则发送1。如果不起作用,请删除二进制文件,因为程序的行为不当!

不要使用kill -9。不要带出联合收割机只是为了整理花盆。

Usenet的另一无用用途,

(。签名)

230
Shawn J. Goff

kill -9,就像应该总是可以通过拉动电源线来关机一样。它可能是反社会的,需要做一些恢复工作,但它应该起作用,并且是不耐烦的动力工具。

我说这是首先尝试普通杀死(15)的人,因为它确实使程序有机会进行一些清理–也许只是写到“退出sig 15”的日志。但是我不会接受关于杀死-9的不良行为的任何投诉。

原因:很多客户都喜欢程序员喜欢而不喜欢的事情。随机kill -9测试是一个很好且公平的测试方案,如果您的系统不处理它,则您的系统已损坏。

77
dbrower

我使用kill -9的方式与将厨房用具扔到洗碗机中的方式几乎相同:如果厨房用具被洗碗机破坏了,我就不要了。

most程序(甚至是数据库)也是如此:如果我无法在没有麻烦的情况下杀死它们,那么我真的不想要使用它们。 (并且,如果您碰巧使用了其中一种鼓励您假装它们没有持久化数据的非数据库之一:那么,我想是时候开始考虑自己的工作了)。

因为在现实世界中,东西可能会由于任何原因随时掉落。

人们应该编写可以崩溃的软件。特别是在服务器上。您应该学习如何设计假设事情会破裂,崩溃等的软件。

桌面软件也是如此。当我想关闭浏览器时,通常需要AGES才能关闭。有nothing我的浏览器needs最多需要花费几秒钟的时间。当我要求它关闭时,应该设法立即执行此操作。如果不是,那么,我们拿出kill -9并使其成功。

39
borud

永远不要做kill -9 1。另外,请避免对某些进程(如mount`)执行kill操作。当我不得不杀死许多进程时(例如,X会话被挂起,而我必须杀死某个用户的所有进程),我就颠倒了进程的顺序。例如:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|Ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

请记住,kill不会停止进程并释放其资源。它所做的只是向进程发送SIGKILL信号;您可能会遇到一个挂起的进程。

6
HandyGandy

故意杀死进程不是一个平稳的举动:数据可能会丢失,设计不当的应用程序可能会以微妙的方式破坏自身,这些方式只有重新安装才能修复。但这完全取决于了解什么是安全的,什么不安全的。给定情况。以及有什么风险。用户应该了解某个进程正在执行或应该执行的操作以及它的约束条件(磁盘IOPS,rss/swap),并能够估算长时间运行的进程应花费的时间(例如文件副本, mp3重新编码,电子邮件迁移,备份,[您最喜欢的时间在这里]。)

此外,将SIGKILL发送到pid不能保证将其杀死。如果卡在系统调用中或已被僵尸(Z中的ps),则可能会继续被僵尸。这通常是^ Z一个长时间运行的过程,在尝试kill -9之前忘记bg的情况。一个简单的fg将重新连接stdin/stdout并可能解除阻塞该进程,通常随后该进程终止。如果卡在其他地方或处于其他形式的内核死锁中,则只有重新启动才能删除该进程。 (在内核处理SIGKILL之后,僵尸进程已经死了(不再运行用户级代码),通常是由于内核原因(类似于被“阻塞”等待系统调用完成)导致进程没有终止。)

另外,如果要杀死进程及其所有子进程,请养成使用取反的PID,而不仅仅是PID本身调用kill的习惯。不能保证SIGHUPSIGPIPESIGINT或其他信号在清除后都得到清除,并且有许多不知名的进程进行清除(还记得杂种吗?),这很烦人。

邪恶的奖励:kill -9 -1kill -9 1更具破坏性(除非您要查看扔掉的,不重要的VM会发生什么,否则请不要以root用户身份使用 =

5
dhchdhd

我创建了一个脚本来帮助自动解决此问题。

它基于我的完整答案 2 ,该问题与 stackoverflow 非常相似。

您可以在那里阅读所有说明。总而言之,我只推荐SIGTERMSIGKILL,甚至_SIGTERMSIGINTSIGKILL。但是,我在完整答案中提供了更多选项。

请随意从github下载(克隆) 要杀死的存储库(1

3
Dr Beco

为什么您不希望正常进行_kill -9_进程

根据_man 7 signal_:

无法捕获,阻止或忽略信号SIGKILL和SIGSTOP。

这意味着接收到这些信号之一的应用程序无法“捕获”它们以执行任何关闭行为。

在进程上运行_kill -9_之前应该做什么

您应该确保在将信号发送到进程之前,您已经:

  1. 确保过程不忙(即做“工作”);向过程发送_kill -9_实质上会导致该数据丢失。
  2. 如果该进程是无响应的数据库,请确保已首先刷新其缓存。一些数据库支持向进程发送其他信号,以强制刷新其缓存。
3
user26053