kill -9
,但是我看到其他管理员几乎总是这样做。我认为可能存在明智的中间立场,因此:
何时以及为什么应使用
kill -9
?什么时候以及为什么不这样做?进行该操作之前应该尝试什么?
什么样的调试“挂起”过程可能会导致进一步的问题?
#1 楼
通常,应在kill
(kill -s TERM
)之前使用kill -15
(kill -9
的缩写,或者在大多数系统上为kill -s KILL
),以便目标进程有机会自行清理。 (进程无法捕获或忽略SIGKILL
,但是它们可以捕获并经常捕获SIGTERM
。)如果您不给该进程完成其工作和清理的机会,则可能会损坏文件(或其他状态)重新启动后将无法理解。strace
/ truss
,ltrace
和gdb
通常是了解为什么卡住的进程被卡住的好主意。 (Solaris上的truss -u
尤其有用;我发现ltrace
经常以无法使用的格式提供库调用的参数。)Solaris还具有基于/proc
的有用工具,其中一些已移植到Linux。 (pstack
通常很有帮助)。评论
令人信服的原因是,如果您习惯于发送SIGKILL,那么当您进入某个程序时,例如,它将损坏您或您的公司的重要数据库时,您真的会后悔。 kill -9作为最后的终结者,它的用途是强调最后的终结;在最后解决方案之前使用它的管理员a)不知道自己是一名管理员,并且b)不应在生产系统上使用。
–Arcege
2011-3-9在12:39
@Mikel要做的另一件事,有时最好诱使应用程序对SIGQUIT或SIGSEGV等信号进行清理,如果它对SIGINT / SIGTERM没有响应。例如,全屏3-D应用程序甚至Xorg。使用SIGQUIT,它没有机会清理任何东西,而是诱使它认为发生段故障,并且感觉除了清理并退出之外别无选择。
–penguin359
2011年4月3日,11:10
@Arcege您是否认为如果使用被-9杀死会损坏数据的数据库毕竟值得使用? iirc,mysql,bdb,pg等...在被-9杀死时都表现良好。
– dhruvbird
2014年1月28日下午6:52
杀戮-9 Java ftw
– dmourati
2014年1月28日在7:10
@dhruvbird:仅仅因为您的数据库配备了防弹背心,并不意味着您不需要射击它们。尽管您认为它不像Arcege所说的那样危险是对的,但我认为他的观点仍然是认为它有风险,应该是万不得已。
–iconoclast
2014年1月30日15:34
#2 楼
兰德尔·施瓦兹(Randal Schwartz)过去经常在列表上张贴“(x)的无用”。一个这样的帖子是关于kill -9
。它包括原因和遵循的食谱。这是重建的版本(在下面引用)。(可憎的行情)
不,不,不。不要使用kill -9。
这不会给进程带来干净的机会:
1)关闭套接字连接
2)清理临时文件
3)通知其子项即将消失
4)重置其终端特性
等等
通常,发送15,然后等待一两秒钟,如果不起作用,则发送2,如果不起作用,则发送1。不会,请删除二进制文件,因为程序的行为不当!
不要使用kill -9。不要仅仅为了收拾花盆而带出联合收割机。
Usenet的另一种无用用法,
(.signature)
评论
进程终止时,操作系统是否不会关闭任何打开的文件描述符(包括套接字)?
–布赖恩·戈登(Brian Gordon)
2014年1月28日下午5:10
是的,它会。但是,假设您要杀死连接了客户端的服务器进程,那么客户端将不会在超时之前注意到服务器已关闭。
–BjörnLindqvist
2014年1月28日上午8:48
嗯,是旧的“如果它在任何方面都不完美,那么使用它就是愚蠢的”自变量。
– Timmmm
2014年1月28日19:17
如果所涉及的过程是您公司的生产,或者使用愚蠢的方法
– Warren P
2014年1月29日,下午3:24
如果某个进程被杀死,则套接字将向该对等方发送RST,就像该进程在套接字上调用close或shutdown一样,然后套接字将发送FIN。无需超时。仅当电源断开或网络电缆断开时,才会发生超时情况。
–ctrl-alt-delor
16年5月31日在22:41
#3 楼
总是可以执行kill -9
,就像通过拉动电源线来关闭它总是可以的一样。它可能是反社会的,需要做一些恢复工作,但它应该起作用,并且是不耐烦的强大工具。我说这是一个会尝试简单杀人的人(15)首先,因为它确实为程序提供了进行清理的机会-也许只是写入“ sig 15退出”日志。但是我不会接受任何有关-9杀人行为的投诉。原因:很多客户都是程序员喜欢而不愿意这样做的。随机kill -9测试是一个很好且公平的测试方案,如果您的系统不处理它,则您的系统已损坏。
评论
您如何测试“随机杀死-9”?当您杀死-9时,您就完成了。
– KarelBílek
2014年1月28日在7:28
@Karel:您将测试系统是否可以在此之后恢复,并清除SIGKILL时正在处理的所有混乱事务。
– Tadeusz A.Kadłubowski
2014年1月28日上午8:09
杀掉-9就像把插头拔掉也不行。当然,在某些情况下您别无选择,这应该是不得已的选择。当然,拔电源线或杀死-9不会产生任何不利影响,例如阻止应用程序或操作系统正常重新启动,但是会发生垃圾并且使用推荐的方法(杀死[-15])或定期关机会帮助您避免例行中断程序和操作系统时可能发生的混乱情况。在任何情况下,无论代码的健壮性如何,始终都有丢失数据的风险。
– jlliagre
2014年1月28日12:51
我怀疑Michael所说的“确定”是指您的程序应该优雅地处理这种情况,并且能够在重新启动时进行某种形式的清除。例如,清理PID文件等,而不仅仅是将其玩具扔出婴儿车并拒绝启动。
– gerryk
2014年1月28日在22:58
@gerryk他们的确应该这样做,但问题是,无论情况和环境如何,有人都会以“杀死-9的许可证”来回答。这是一种不负责任的态度。
– jlliagre
2014年1月29日在7:24
#4 楼
我使用kill -9的方式与将厨房用具扔进洗碗机的方式几乎相同:如果厨房用具被洗碗机破坏了,那么我就不要了。大多数程序都一样(甚至是数据库):如果我不能在没有麻烦的情况下杀死它们,那么我真的不想要使用它们。 (而且,如果您碰巧使用了其中一种鼓励您假装它们没有持久化数据的非数据库,那么,我想是时候开始考虑自己的工作了。)
因为在现实世界中,东西可能会由于任何原因随时崩溃。
人们应该编写能够承受崩溃的软件。特别是在服务器上。您应该学习如何设计假定事情会破裂,崩溃等的软件。
台式机软件也是如此。当我想关闭浏览器时,通常需要AGES才能关闭。我的浏览器无需执行任何操作,最多只需花费几秒钟的时间。当我要求它关闭时,应该设法立即执行此操作。如果不是这样,那么我们拿出kill -9并使其成功。
评论
我同意应该编写一个能够容忍这种失败的程序,但是我认为这样做仍然是一种不好的做法。数据库将恢复,但是它可能会检测到粗鲁的中止,然后在重新启动时触发大量的恢复检查。流程正在处理的请求又如何呢?它们将立即被切断,客户端可能也有错误并且也失败了?
–丹尼尔·詹姆斯·布莱尔斯(Daniel James Bryars)
2014年5月24日上午9:40
不能随时杀死的数据库不是正确可靠的数据库。如果需要一致性,这是一个非常基本的要求。至于客户端:如果在断开连接时他们陷入混乱并破坏了数据,那么它们的设计也很糟糕。解决服务丢失的方法是通过冗余和自动故障转移/重试策略。通常,对于大多数系统而言,快速故障胜于尝试恢复。
– Borud
2014年9月19日下午16:36
@borud可能不是完美编写的软件,但它是人们一直使用的软件。哪些系统管理员总是能够选择完美编写的软件,而总能从突然中断中正常恢复,这是什么奢望?不太多。我个人使用关机脚本,并以此启动/停止进程。如果他们不响应关闭脚本(该脚本会对进程发出适当的信号),我将杀死-9。
– Steve Sether
2014年12月29日20:59
就工具而言,烹饪基本食材和更复杂的菜肴没有区别。区别在于厨师。 (但是,如果您花与我一样多的时间做饭,您就会意识到健壮性是厨房工具的最低要求,并且大多数向消费者出售厨房用品的人不会从一个好的工具中知道一个坏的工具。)
– Borud
17年7月19日在19:25
所以您鼓励人们草率,因为很难正确地做事?越来越多的软件在短暂的操作环境中运行。如果您编写的软件在无法正常关闭的情况下变得繁琐,那么您将很难说服雇主雇用您作为开发人员。
– Borud
18年5月18日在22:03
#5 楼
在所有其他答案中都没有提到的情况是,当一个进程为kill -9
并且无法被杀死时,<defunct>
根本无法工作: >已失效的进程是什么,为什么它没有被杀死?因此,在尝试
kill -9
之前,请先运行<defunct>
进程以查看其父代是什么,然后尝试ps -ef
(TERM)或-15
(INT)并注意:
-2
的作用。以后编辑和警告:杀死进程,其父母或子女时要格外小心,因为它们可能会使文件打开或损坏,连接未完成,可能会损坏数据库等,除非您知道
-9
对某个进程做了什么,只能将其用作最后的手段,并且如果需要运行kill,请在使用ps -ef
之前使用上面指定的信号#6 楼
故意杀死进程不是一个平稳的举动:数据可能会丢失,设计不当的应用程序可能会以微妙的方式破坏自身,这些方式只有重新安装就无法修复。.但这完全取决于了解什么是安全的,什么不安全的。给定情况。以及可能面临的风险。用户应该了解某个进程正在执行或应该执行的操作以及它的约束条件(磁盘IOPS,rss / swap),并能够估算一个长时间运行的进程应花费的时间(例如文件副本, mp3重新编码,电子邮件迁移,备份,[您最喜欢的时间在这里]。)
此外,将
SIGKILL
发送到pid不能保证将其杀死。如果卡在系统调用中或已经被僵化(Z
中的ps
),则它可能会继续被僵化。这通常是^ Z一个长时间运行的过程,在尝试bg
之前先忘记kill -9
的情况。一个简单的fg
将重新连接stdin / stdout并可能取消阻止该进程,通常随后该进程终止。如果卡在其他地方或处于其他形式的内核死锁中,则只有重新启动才能删除该进程。 (SIGKILL
被内核处理后,僵尸进程已经死了(不会再运行用户级代码),通常是内核原因(类似于“阻塞”等待系统调用完成)导致进程未终止。)另外,如果您想杀死一个进程及其所有子进程,请养成使用否定PID调用
kill
的习惯,而不仅仅是PID本身。无法保证SIGHUP
,SIGPIPE
或SIGINT
或之后的其他信号被清除,并且有许多不知名的清除程序(还记得杂种吗?)令人讨厌。比kill -9 -1
(除非您要查看扔掉的非重要VM会发生什么,否则不要以root用户身份进行操作)#7 楼
永远不要做kill -9 1
。另外,请避免对某些进程(如mount`)执行kill操作。当我不得不杀死许多进程时(例如,X会话被挂起,而我必须杀死某个用户的所有进程),我就颠倒了进程的顺序。例如:ps -ef|remove all processes not matching a certain criteria| awk '{print }'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash
请记住,
kill
不会停止进程并释放其资源。它所做的只是向该进程发送一个SIGKILL信号。 ;您可能会遇到挂起的进程。
评论
反对者是其他人。但是哪些资源没有释放?您只是意味着该进程无法执行其正常清理吗?那文件锁,信号灯等等呢?你能详细说明吗?
– Mikel
2011-3-9在11:39
看来至少必须清理SysV共享内存和信号量。 archives.postgresql.org/pgsql-general/2006-10/msg01065.php
– Mikel
2011年3月9日在20:36
这个答案部分令人困惑,部分错误。在大多数大学中,kill -9 1只是被忽略了。无需避免kill -9进行挂载,但也没有意义。我不知道您所说的“颠倒流程顺序”是什么意思。 kill -9确实停止了进程(例如杀死进程),而没有给予它投诉的机会,但是,如果进程处于不可中断的系统调用中,则不会立即终止进程。使用kill -9杀死进程不会释放大多数资源,但不是全部。
–吉尔斯'所以-不再是邪恶的'
2011年3月9日21:01
#8 楼
为什么不希望kill -9
正常运行根据
man 7 signal
:无法捕获,阻止或忽略信号SIGKILL和SIGSTOP。
这意味着接收到这些信号之一的应用程序无法“捕获”它们以执行任何关闭行为。
在进程上运行
kill -9
之前应执行的操作您应该确保在向流程发送信号之前,确保:
确保流程不忙(即执行“工作”) ;向该进程发送
kill -9
实质上会导致该数据丢失。如果该进程是无响应数据库,请确保已首先刷新其缓存。一些数据库支持向进程发送其他信号,以强制刷新其缓存。
#9 楼
我创建了一个脚本来帮助自动解决此问题。它基于我的完整答案2,该问题与stackoverflow非常相似。
您可以阅读所有说明。那里。总而言之,我只推荐
SIGTERM
和SIGKILL
,甚至SIGTERM
,SIGINT
和SIGKILL
。但是,我在完整答案中提供了更多选项。 请随意从github存储库下载(克隆)它以杀死1
评论
一个很好的相关SO答案。