Kill -9 挂起,无法杀死进程(谋杀证明进程)

Kill -9 挂起,无法杀死进程(谋杀证明进程)

可能的重复:
如果“kill -9”不起作用怎么办?

我想现在问这个有点晚了,但仅供将来参考;

今天,在一位客户报告 ssh 连接速度很慢并且执行命令也很慢(有些根本无法工作)后,我被叫去查看服务器。

登录后,我可以立即打字,所以我不认为这是延迟或带宽饱和等网络问题(因为我发现这往往与您的 ssh 体验直接相关)。我首先尝试运行top,一分钟没有任何反应后我用 CTRL+C 取消了这个操作。提示已挂起等待top启动。

free -m在我取消之前,也只是在提示符处挂了一分钟或更长时间。

df -h确实执行了,并向我显示有 60% 的可用磁盘空间(我想知道是否某些应用程序已经崩溃并用日志填满了磁盘)。

dmesg也不会执行。

我执行了tail -n 50 /var/log/message,遗憾的是我不再有输出,但看起来有一个严重的问题。许多内存位置以十六进制打印,大概它们的内容(难以理解的杂乱)在右侧。它与中的输出非常相似我在Google上找到了log,试图找到类似的示例,除了在右侧列中大多数行都包含“ext4”,也许存在文件系统错误?

运行时tail -n 50 /var/log/syslog,我在所有记忆疯狂的中间看到了这里重复的几行代码,上面写着 的效果Info procname:pid blocked for more than 120 seconds

我执行ps aux并查看输出,直到发现一个进程的 cpu 使用率达到 299%;

ps aux | grep procname

procuser    8279  299  0.0 479064 41916 pts/6    Sl+  08:05 548:31 /path/to/procname procbox 6390 6394 6395 0

所以这个过程看起来很疯狂,但我无法执行任何与内存相关的命令(无论有或没有 sudo)。例如free -m,或top。我可以cat /proc/meminfo看到 40GB RAM 中大约有 5GB 是可用的。

我尝试过kill PID,但挂了几分钟后我放弃了。我kill -9 PID又试了一次,还是同样的事情。我只能假设这个进程太忙了,以至于它无法回答来自内核的终止消息?我尝试过renice 19 PIDkill -9 PID但这也不起作用,renice会运行,只是挂起。

最后需要硬重启,这并不理想。由于服务器上的专业应用程序,文件现在已损坏等。我还有什么其他选择?

有没有办法简单地停止一个进程?不是发送 SIGTERM,而是直接停止代码的处理,或者类似的?

答案1

我执行了 tail -n 50 /var/log/message ,遗憾的是我不再有输出,但看起来出现了严重的问题。许多内存位置以十六进制打印,大概它们的内容(难以理解的杂乱)在右侧。

它几乎可以是任何东西,这些内核转储的内容对于了解它是什么很重要。

例如,您可能遇到了硬件问题,例如磁盘不再响应请求。尝试运行已缓存在 RAM 中的程序可以正常工作,而运行需要从磁盘读取的程序可能会挂起。

也可能是您遇到了内核错误,或其他一些驱动程序问题,或者 RAM 中出现了错误的位翻转,或者几乎有任何其他不良硬件。如果驱动程序锁定了内核中的特定资源,然后遇到错误或错误并且无法正确解锁它,则尝试获取该锁的任何其他驱动程序或系统调用都会挂起。

这可能不是内核中的错误。例如,当使用 lvm 或 dmsetup 工具来管理磁盘时,您可能会遇到这种行为。它们都可以挂起一个设备,其结果是“只要该设备挂起,对该设备的任何进一步的 I/O 都将被推迟”。然后尝试访问该设备的程序将简单地在内核中阻塞。您可以使用“dmsetup suspend”手动触发此操作,或者当 LVM 工具遇到错误时,我意外地看到磁盘处于挂起状态。

如果这是一次性的事情,请不要担心。如果再次发生这种情况,请尝试仔细记录内核输出,以便找到其原因。第一个故障转储将是最重要的。如果这种情况发生很多次并且您无法获得输出,请考虑使用网络控制台将内核输出直接发送到另一台机器。

答案2

停止一个进程就是这样kill做的。我认为运行kill -9 PID并等待它获得足够的资源来处理是正确的答案。

如果您认为进程占用了内存,您还可以手动调用 OOM Killer:

echo f > /proc/sysrq-trigger

相关内容