Answers:
通常,您应该在()之前使用kill
(kill -s TERM
或,在大多数系统上为),为目标进程提供一个在其自身之后进行清理的机会。(进程不能捕获或忽略,但是它们可以捕获并经常捕获。)如果您没有给该进程完成其运行和清理的机会,它可能会在其周围留下损坏的文件(或其他状态)。重新启动后将无法理解。kill -15
kill -9
kill -s KILL
SIGKILL
SIGTERM
strace
/ truss
,ltrace
并且gdb
通常是在寻找原因被卡住的过程被卡住好主意。(truss -u
在Solaris上特别有用;我发现ltrace
经常以不可用的格式为库调用提供参数。)Solaris上还有/proc
一些基于工具的有用工具,其中一些已移植到Linux。(pstack
通常很有帮助)。
kill -9
作为最后手段的终结者,它的用途是强调最后手段;在最后解决方案之前使用它的管理员a)不太了解自己是否是管理员,并且b)不应在生产系统上使用。
兰德尔·施瓦兹(Randal Schwartz)过去经常在列表上张贴“(x)的无用”。一篇这样的帖子是关于kill -9
。它包括原因和遵循的配方。这是重建的版本(在下面引用)。
(可憎行情)
不不不。不要使用kill -9。
它并没有给过程一个干净的机会:
1)关闭插座连接
2)清理临时文件
3)告知其孩子将要消失
4)重置其终端特性
等等,依此类推。
通常,发送15,然后等待一两秒钟,如果不起作用,则发送2,如果不起作用,则发送1。如果不起作用,请删除二进制文件,因为程序的行为不当!
不要使用kill -9。不要带出联合收割机只是为了整理花盆。
Usenet的另一无用用途,
(。签名)
这样做应该总是可以的kill -9
,就像通过拉动电源线来关闭它总是可以的一样。它可能是反社会的,需要做一些恢复工作,但它应该起作用,并且是不耐烦的动力工具。
我说这是首先尝试普通杀死(15)的人,因为它确实使程序有机会进行一些清理–也许只是写到“退出sig 15”的日志中。但是我不会接受关于杀死-9的不良行为的任何投诉。
原因:很多客户都喜欢程序员喜欢而不喜欢的事情。随机kill -9测试是一个很好且公平的测试方案,如果您的系统不处理它,则您的系统已损坏。
kill -9
,就像它是不正常拔出插头了。当然,在某些情况下您别无选择,这应该是不得已的选择。当然,拔电源线或kill -9
不会产生不利影响,例如根本阻止应用程序或OS正常重启,但是发生这种情况并使用建议的方法(kill [-15]
)或定期关机将有助于避免因以下情况而发生的混乱情况:您通常会以这种方式中断程序和操作系统。无论如何,无论代码的健壮性如何,始终都有丢失数据的风险。
我使用kill -9的方式与将厨房用具扔到洗碗机中的方式几乎相同:如果厨房用具被洗碗机破坏了,我就不要了。
这同样适用于大多数程序(甚至数据库):如果我不能没有事情会失控杀了他们,我真的不希望使用它们。(并且,如果您碰巧使用了其中一种鼓励您假装它们没有持久化数据的非数据库之一:那么,我想是时候开始考虑自己的工作了)。
因为在现实世界中,东西可能会由于任何原因随时掉落。
人们应该编写可承受崩溃的软件。特别是在服务器上。您应该学习如何设计假设事情会破裂,崩溃等的软件。
桌面软件也是如此。当我想关闭浏览器时,通常需要AGES才能关闭。有没有我的浏览器需要做的应该比大多数几秒钟。当我要求它关闭时,应该设法立即执行此操作。如果不是,那么,我们拿出kill -9并使其成功。
在其他所有答案中都没有提到的是kill -9
,当某个进程无法终止时,它根本不起作用<defunct>
:
因此,在尝试运行kill -9
某个<defunct>
进程ps -ef
以了解其父代之前,先对其父代执行-15
(TERM)或-2
(INT),最后执行-9
(KILL)。
注: 什么ps -ef
呢。
以后的编辑和警告:杀死进程,其父级或子级时要格外小心,因为它们可能会使文件打开或损坏,连接未完成,可能损坏数据库等,除非您知道kill -9
该进程的用途,否则只能将其用作最后的手段,如果您需要执行kill命令,请在使用前使用上面指定的信号-9 (KILL)
永远永远不要做一个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信号;您可能会遇到一个挂起的进程。
kill -9 1
在大多数联合国机构中只是被忽略了。无需避免kill -9
for mount
,但也没有意义。我不知道“颠倒流程顺序”是什么意思。kill -9
确实停止了进程(例如杀死进程),却没有机会抱怨,但是,如果进程处于不间断的系统调用中,则不会立即终止进程。使用杀死进程kill -9
不会释放大多数资源,但不会释放全部资源。
故意杀死进程不是一个平稳的举动:数据可能会丢失,设计不当的应用程序可能会以微妙的方式破坏自身,这些方式只有重新安装才能修复。给定情况。以及有什么风险。用户应该了解某个进程正在执行或应该执行的操作以及它的约束条件(磁盘IOPS,rss / swap),并能够估算长时间运行的进程应花费的时间(例如文件副本, mp3重新编码,电子邮件迁移,备份,[您最喜欢的时间在这里]。)
此外,发送SIGKILL
给pid并不能保证将其杀死。如果卡在系统调用中或已被僵尸(Z
in ps
),则可能会继续被僵尸。^ Z通常是一个长期运行的过程,bg
在尝试之前忘记kill -9
了。一个简单的方法fg
将重新连接stdin / stdout并可能解除阻塞该进程,通常随后该进程终止。如果卡在其他地方或处于其他形式的内核死锁中,则只有重新启动才能删除该进程。(僵尸进程在SIGKILL
由内核处理后已经死了(不会再运行用户级代码),通常是内核原因(类似于“阻塞”等待系统调用完成)导致进程未终止。)
另外,如果您想杀死一个进程及其所有子进程,请养成kill
使用否定PID进行调用的习惯,而不仅仅是PID本身。有没有担保SIGHUP
,SIGPIPE
或SIGINT
或其它信号清理后,并具有一堆六亲不认进程清理(记得杂种?)是烦人的。
额外的邪恶:kill -9 -1
比kill -9 1
(如果您不是root的人,除非您想看到在扔掉的,不重要的VM上会发生什么),否则更具破坏性
kill -9
正常处理根据man 7 signal
:
无法捕获,阻止或忽略信号SIGKILL和SIGSTOP。
这意味着接收到这些信号之一的应用程序无法“捕获”它们以执行任何关闭行为。
kill -9
在流程上运行之前应该做什么您应该确保在将信号发送到进程之前,您已经:
kill -9
给进程实际上会导致该数据丢失。