我的嵌入式系统在运行几个小时后没有响应。经过调查,我发现系统不断增加进程列表<defunct>
。运行ps axl
会给出一个长列表,其中一个片段如下:
1 0 6421 1 20 0 0 0 exit Zs ? 0:00 [timeout] <defunct>
1 0 6429 1 20 0 0 0 exit Zs ? 0:00 [timeout] <defunct>
1 0 6476 1 20 0 0 0 exit Zs ? 0:00 [timeout] <defunct>
1 0 6497 1 20 0 0 0 exit Zs ? 0:00 [timeout] <defunct>
我无法终止这些进程。这些进程的增加会耗尽所有 RAM,从而使系统失去响应。另一个问题是,<defunct>
当我尝试终止启动时由 init 脚本运行的进程时,它们也会消失。我找不到任何线索来说明为什么这些僵尸进程没有被 init 杀死并耗尽 RAM。
答案1
已失效的进程不会占用任何重要的内存,仅占用少量字节来存储其 pid、返回状态和资源使用统计信息。
然而,在正确运行的 Unix/Linux 操作系统上,由 init 为父的失效进程应该会被后者快速回收。
您的系统存在严重的错误,这也可能解释您所观察到的内存泄漏。
答案2
正如其他人一样,我怀疑这些失效的进程是否使用了任何大量的 RAM,您还可以在ps
给出的输出中看到,详细说明内存使用情况的列中有零。
Defnct(或僵尸 - 这就是 Z 的来源)进程无法被杀死,它们只会在进程表中徘徊,直到其父进程读取其退出状态 - 因此您应该修复父进程。
答案3
使用 #ps auxwww 寻找僵尸 | grep -w Z | | grep -w Z | grep 已失效 | grep -v grep
检查这些僵尸进程的父进程 ID 并杀死它。
答案4
问题的根本原因是硬件故障。ttyS1
系统端口每秒接收数千个中断,这反过来又导致kworker
.这导致了进程堆的创建<defucnt>
并且未被清理init
。init
正如 @jilliagre 所建议的,这可能是错误。
禁用getty
就ttyS1
解决了问题。