我正在运行 Ubuntu 12.04,遇到了一个大问题。今天两次,我的一个打开的 gnome-terminal 会话被锁定并打印了错误
pipe: too many open files
我意识到这可能与我的用户限制有关ulimit -n
,顺便说一下,我的用户限制是 1024。问题是,一旦发生这种情况,我可以强制退出有问题的终端,但随后我无法打开任何会生成新 PID 的东西。例如,我无法使用它xkill
来终止任何东西,无法打开另一个终端来查看 top,无法运行关机,无法只转到控制台并登录。单击任何应该打开 X 窗口的链接都会出现一个新窗口,其中显示:
There was an error launching the application.
Details: Failed to fork (Cannot allocate memory)
这是我按下 Ctrl+Alt+F1 后尝试登录时遇到的相同错误。由于我完全卡在了这里,我被迫硬启动我的机器。这使得调试变得极其困难。
一旦遇到此错误,我可以做什么来恢复?我应该如何追踪错误?
最后要说的是,我并没有运行大量的东西:两个终端,一个带有 2 个选项卡的 byobu 会话,一个带有 python 会话;一个 emacs 实例,一个 google chrome 和几个 ROS(机器人操作系统)节点。
编辑
按 Ctrl+Alt+Backspace 重新启动显示管理器,我就可以重新登录并开始打开终端。使用ps
显示仍有许多进程在运行,这些进程在发生锁定时一直在运行。至少,这允许我从软件重新启动我的机器。我应该如何确定导致此问题的原因?
编辑2
我刚刚打开了两个我刚刚搁置的终端,等待崩溃发生。崩溃发生后,我能够从 的输出中截取屏幕截图top
。不知道输出是否特别有用,但我已经将其附加了。我注意到的唯一特别奇怪的是,有 5 个僵尸进程。
答案1
似乎某个地方存在资源泄漏。您可以运行“lsof”来获取所有打开文件的列表(显然是在系统资源不足之前的某个时间点)。将列表与活动 pid 进行比较,您(也许)会找到罪魁祸首。
我还建议更改 /etc/security/limits.conf 中的打开文件限制(或者可能是其他地方?我有一段时间没有关注 Ubuntu 了,似乎有人猜测 limits.conf 默认未加载)。如果您确实存在资源泄漏,这只会延长问题。请先查找泄漏。
答案2
打开文件过多消息可能是进程特定的问题,而不是系统范围的问题。“无法分配内存”可能是进程特定的问题,但可能是系统范围的问题。
正如 cydonian.monk 指出的那样,存在某种资源泄漏。最可能的罪魁祸首是失控或行为不当的进程,该进程要么反复生成子进程,要么存在错误或内存泄漏,导致其反复打开文件和/或分配内存,以至于系统内存不足。
我会关注您在第一个收到打开过多文件消息的 gnome 终端窗口中所做的事情。确定从该窗口运行的内容并关注其行为。每隔几分钟运行一次 ps 是 cron,或者运行top -b
并将输出保存到文件可能会让您了解下次崩溃发生时发生了什么。
您提供的顶部输出看起来像一个正常运行的系统。
答案3
您是否尝试过增加文件数量的上限?
您需要做的是将这些行添加到 /etc/security/limits.conf 中
* soft nofile 6000
* hard nofile 6000