Linux 中所有终端窗口突然消失

Linux 中所有终端窗口突然消失

提前为冗长的文字道歉。我遇到了一个问题,它让我对可能发生的事情几乎没有线索。另外,如果 ServerFault 不是这个问题的理想场所,我深表歉意,但我认为 StackOverflow 并不合适,因为它没有出现是我的代码本身有问题,因为我的测试设置以某种方式压垮了系统。

背景

我正在开发 PCIe 板的内核驱动程序。我运行的机器有 24 个内核和相当多的 RAM。它运行的是 RHEL 5.7,Linux 内核为 2.6.18。抱歉,我不知道确切的规格,因为到目前为止这都不重要,而且我今天下班前也没有想到要检查一下。这是一台开发机器,我的驱动程序(和相关的测试实用程序)是唯一运行在它上面的程序。我不会详细介绍设备或驱动程序,因为它们并不重要似乎是导致问题的原因,但基本上该设备有 4 个独立的 RS-232 串行接口,我的驱动程序创建了四个字符设备,相应的设备节点位于 /dev/ 中。驱动程序还创建了许多 sysfs 属性。其中一些属性用于显示/设置板上的各种寄存器,其他属性是从其中一个串行端口接收到的数据解析出的实际遥测数据。编辑:仔细想想,遥测数据 sysfs 属性是通过hwmon内核 API 创建和管理的。不确定这是否与此有关,但目前,我不知道哪些细节可能很重要。

为了给驱动程序施加压力并使一切以最大速度运行,我打开了大量终端窗口:hexdump每个字符设备上运行四个窗口,另外四个窗口连续转储代表每个串行端口的设备寄存器的 sysfs 属性的内容,另一个窗口连续转储与遥测相关的 sysfs 属性。我还运行了一个窗口top,另一个窗口正在运行watch 'dmesg | tail -40'以查看我的驱动程序生成的任何调试信息(信息不多 - 只是诸如打开/关闭 chardev、任何错误等)。

问题

运行大约 15-20 分钟后,我的所有终端窗口突然同时消失。没有错误弹出,dmesg除了我的驱动程序报告字符设备已关闭外,没有显示任何内容。系统保持稳定。我可以打开新窗口等。我的驱动程序似乎一直在嗡嗡作响,就像什么都没发生一样。从驱动程序的角度来看,这看起来就像所有四个hexdump进程都同时退出了,并且我的关闭函数没有报告任何错误。

我一直在 Google、论坛和类似网站上搜索,但尚未找到任何与我看到的情况相近的东西。好像发生了一些错误情况,导致 Linux 决定需要立即终止我的所有进程。我当时想也许是某种类型的资源耗尽,比如内存、文件描述符等,但像topvmstatlsof、 这样的实用程序iostat(不确定这与任何事情有什么关系,但我还是检查了一下)似乎没有显示任何异常。该系统有大约 20 个 CPU 核心和大量 RAM,在所有这些运行时,它似乎几乎不会出什么问题。也就是说,直到我的所有进程都直接死亡。

我不知道下一步该检查什么。我想也许一次监控几十个 sysfs 属性,并尽可能快地转储它们可能不是 sysfs 的设计初衷,但系统似乎没有给我任何迹象表明这有问题,而且我的驱动程序似乎可以轻松跟上 sysfs “show” 调用的持续冲击,同时仍能确保字符设备不出现任何故障(整个过程中数据看起来都很好)。

还有一件事我应该提一下(尽管我不确定它是否相关),我尝试过在稍微不同的配置下进行此操作,其中四个串行端口中的两个端口带有环回连接器,并且hexdump我没有在这两个字符设备上运行,而是运行了自己的误码率测试器实用程序。总共,我尝试了 4 次,每次结果都一样。大约 15 分钟后(上下浮动 5 分钟),所有终端窗口同时关闭,驱动程序继续正常运行,dmesg 输出中绝对没有任何异常。

有什么想法可能导致这样的事情发生吗?

TL;DR:我的所有终端窗口都会自动关闭,没有任何明显迹象表明出了什么问题。系统保持稳定,dmesg 输出中没有任何异常。这是在 RHEL 5.7 上。

答案1

您使用的是什么终端?您知道桌面管理器中包含的一些花哨的 GUI 终端实际上​​是多线程进程。因此,有一个包含所有子终端的容器应用程序。这用于为您提供诸如带有选项卡中终端的窗口之类的功能。

如果某个终端中存在导致主进程崩溃的错误,您将失去一切。您可以尝试使用 xterm,而不是您正在使用的任何终端。或者确保您以每个终端都是一个单独进程的方式调用终端,请参阅终端的手册页。

答案2

检查/var/log/并读取那里的每个日志文件,查找与终端关闭时间相似的时间。

如果你找不到任何有用或相关的内容,请尝试其他终端解决方案,例如,使用 kconsole xterm

作为替代测试,增加终端本身的缓冲区大小。(取决于你使用哪个可能有点棘手,但谷歌应该会有所帮助)

几年前我遇到过类似的问题,运行 tail -f 时 kconsole 不再显示任何数据。对我来说,这是一个缓冲区错误。

相关内容