可能的重复:
如果“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 PID
,kill -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