几天来,我在 Manjaro Linux 机器上启动的很多进程都没有正常退出,而是停止运行。我首先注意到,feh
即使我按下 Q,窗口仍然存在,需要xkill
删除。我重新安装了 feh(由于滚动发布模式,还重新安装了其他几个软件包)。我有一个正在运行的计算模型,我不想不必要地中断它(一段时间以来,也许我对硬件造成了不良影响?虽然我没有对笔记本电脑进行超频或做任何其他不寻常的事情),所以我尝试在 Web 浏览器中查看输出图片,现在我有几个 qutebrowser 和 firefox 进程以及其他一些应用程序(例如 vlc、gimp)挂起,一些有停止运行的子进程,一些本身停止运行。
什么原因会导致进程变成僵尸进程而不是以这种极端和普遍的方式退出?我该如何调试并希望修复原因?
答案1
僵尸进程是指执行已完成但仍在进程表中有一个条目的进程。僵尸进程通常发生在子进程中,因为父进程仍需要读取其子进程的退出状态。 https://www.tutorialspoint.com/what-is-zombie-process-in-linux#:~:text=A%20zombie%20process%20is%20a,read%20its%20child's%20exit%20status.&text=This%20is%20known%20as%20reaping%20the%20zombie%20process。
这意味着父进程在子进程之前结束(崩溃?)。可能是 OOM killer 或段错误之类的原因 - 如果它开始对多个进程执行此操作,则可能是 libc 之类的程序中的错误,也可能是窗口管理器或内核,甚至是硬件问题(内存损坏)。
任何后台进程(守护进程)是否也有僵尸进程?例如,如果你安装了 apache 或 nginx 并让它运行 20 个进程,它是否曾经有一个僵尸进程?如果没有,我会关注窗口管理器。你可以切换窗口管理器吗?这有什么区别吗?我没有使用过 Manjaro Linux,但它似乎是基于 arch。你能检查所有已安装软件包的完整性吗?我在这里找到了一些指南https://bbs.archlinux.org/viewtopic.php?id=34281
无论如何,您要寻找的是某个进程启动另一个进程,并且第一个进程在第二个进程之前结束,而这通常不应该发生。