Mik*_*kel 419 linux command-line kill process-management
我总是很犹豫要不要跑kill -9,但我看到其他管理员几乎是例行公事。
我认为可能有一个明智的中间立场,所以:
kill -9使用?什么时候,为什么不呢?gee*_*aur 386
通常,您应该在( )之前使用kill( 的缩写kill -s TERM,或在大多数系统上kill -15)让目标进程有机会在其之后进行清理。(进程不能 catch 或 ignore ,但他们可以并且经常会 catch 。)如果你不给进程一个机会来完成它正在做的事情并清理它,它可能会在它周围留下损坏的文件(或其他状态)重新启动后将无法理解。kill -9kill -s KILLSIGKILLSIGTERM
strace/ truss,ltrace并且gdb通常是查看卡住进程卡住原因的好主意。(truss -u在 Solaris 上特别有用;我发现ltrace经常以无法使用的格式向库调用提供参数。)Solaris 也有有用的/proc基于工具,其中一些已移植到 Linux。(pstack通常很有帮助)。
Sha*_*off 237
Randal Schwartz 过去经常在列表中发布“(x) 的无用使用”。一个这样的帖子是关于kill -9。它包括原因和要遵循的食谱。这是一个重建版本(引用如下)。
(引用可恶)
不不不。不要使用kill -9。
它没有给进程一个干净的机会:
1) 关闭套接字连接
2)清理临时文件
3)通知它的孩子它正在消失
4) 重置其终端特性
等等等等等等。
通常,发送 15,然后等待一两秒钟,如果这不起作用,则发送 2,如果不起作用,则发送 1。如果没有,请删除二进制文件,因为该程序表现不佳!
不要使用kill -9。不要为了整理花盆而拿出联合收割机。
只是 Usenet 的另一个无用用途,
(。签名)
小智 83
这样做应该总是可以的kill -9,就像通过拉电源线来关闭应该总是可以的一样。它可能是反社会的,需要做一些恢复,但它应该起作用,并且是不耐烦的强大工具。
我这样说是因为有人会首先尝试普通 kill (15),因为它确实给了程序一个机会进行一些清理——也许只是写入“退出 sig 15”的日志。但我不会接受任何关于 kill -9 上的不良行为的投诉。
原因是:很多客户都在做程序员更喜欢但又不喜欢的事情。Random kill -9 测试是一个很好且公平的测试场景,如果您的系统不处理它,则您的系统已损坏。
bor*_*rud 43
我使用 kill -9 的方式与将厨房用具扔进洗碗机的方式大致相同:如果厨房用具被洗碗机损坏了,那么我不想要它。
这同样适用于大多数程序(甚至数据库):如果我不能没有事情会失控杀了他们,我真的不希望使用它们。(如果您碰巧使用这些非数据库之一,鼓励您假装他们没有持久化数据:好吧,我想是时候开始考虑自己在做什么了)。
因为在现实世界中,东西随时可能因任何原因而下降。
人们应该编写能够容忍崩溃的软件。尤其是在服务器上。你应该学习如何设计假设事情会崩溃、崩溃等的软件。
桌面软件也是如此。当我想关闭浏览器时,通常需要 AGES 才能关闭。有没有我的浏览器需要做的应该超过最多几秒钟。当我要求它关闭时,它应该立即设法做到这一点。当它没有时,那么我们拉出 kill -9 并使其成功。
Edu*_*scu 10
在所有其他答案中都没有提到一个kill -9根本不起作用的情况,当一个进程<defunct>被杀死并且不能被杀死时:
所以,你尝试之前,kill -9一个<defunct>进程运行ps -ef,看他的父母是什么,并尝试-15(TERM)或-2(INT),最后-9在他的父(KILL)。
注意:有 什么ps -ef作用。
后期编辑和警告:在杀死进程、它们的父进程或它们的子进程时要小心谨慎,因为它们可能会使文件打开或损坏、连接未完成、可能损坏数据库等,除非您知道kill -9进程的作用,仅将其用作最后的手段,如果你需要运行 kill 在使用之前使用上面指定的信号-9 (KILL)
随意终止进程并不是一帆风顺的:数据可能会丢失,设计不佳的应用程序可能会以微妙的方式破坏自身,如果不重新安装就无法修复......但这完全取决于知道什么是安全的,什么是不安全的给定的情况。以及会有什么风险。用户应该知道一个进程是什么,或者应该做什么,它的约束是什么(磁盘 IOPS,rss/swap),并且能够估计一个长时间运行的进程应该花费多少时间(比如文件复制, mp3 重新编码、电子邮件迁移、备份、[您最喜欢的时间在这里]。)
此外,发送SIGKILL到 pid 并不能保证杀死它。如果它卡在系统调用中或已经僵化(Zin ps),它可能会继续僵化。这通常是 ^Z 一个长时间运行的过程并且bg在尝试之前忘记的kill -9情况。一个简单的fg将重新连接 stdin/stdout 并可能解除对进程的阻塞,通常随后进程终止。如果它卡在其他地方或处于某种其他形式的内核死锁中,则只有重新启动才能删除该进程。(僵尸进程在SIGKILL被内核处理后已经死了(没有进一步的用户态代码将运行),通常有一个内核原因(类似于被“阻塞”等待系统调用完成)进程没有终止。)
此外,如果您想终止一个进程及其所有子进程,请养成kill使用否定 PID调用的习惯,而不仅仅是 PID 本身。不能保证SIGHUP,SIGPIPE或SIGINT其他信号在它之后清理,并且有一堆不知名的进程要清理(还记得杂种吗?)很烦人。
Bonus evil:kill -9 -1比kill -9 1(不要以 root 身份执行任何一项操作,除非您想看看在丢弃的、不重要的 VM 上会发生什么)稍微更具破坏性
永远不要做一个kill -9 1. 还要避免对某些进程(如 mount`)进行终止操作。当我必须杀死很多进程时(例如,一个 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
Run Code Online (Sandbox Code Playgroud)
请记住,kill这不会停止进程并释放其资源。它所做的只是向进程发送一个 SIGKILL 信号;你可能会遇到一个挂起的进程。
小智 5
kill -9正常进行进程根据man 7 signal:
信号 SIGKILL 和 SIGSTOP 无法被捕获、阻止或忽略。
这意味着接收这些信号中的任何一个的应用程序都无法“捕获”它们以执行任何关闭行为。
kill -9在运行进程之前应该做什么您应该确保在向进程发送信号之前:
kill -9本质上会导致该数据丢失。我创建了一个脚本来帮助自动解决此问题。
它基于我在stackoverflow上的一个非常相似的问题中的完整答案2。
您可以在那里阅读所有解释。总而言之,我会推荐 just SIGTERMand SIGKILL,甚至SIGTERM, SIGINTand SIGKILL。不过,我在完整答案中给出了更多选项。
请随意从 github存储库下载(克隆)它来 Killgracely 1