Watchdog—Linux 软件守护进程

作者:Michael Meskes

从 1.3.51 版本开始,Linux 内核提供了一个 watchdog 驱动程序。它不仅负责硬件 watchdog,还实现了软件 watchdog。它由 Alan Cox (alan@lxorguk.ukuu.org.uk) 创建,并由 Angelo Haritsis (ah@doc.ic.ac.uk) 模块化。

什么是软件 Watchdog?

Linux 软件 watchdog 是一个定时器,它从指定的起始值连续倒数。一旦它到达零,一个名为 “watchdog_fire” 的函数将被调用,该函数记录事件并启动硬复位。因此,需要一个 watchdog 守护进程来刷新定时器。只要守护进程存在,定时器就不会触发,但如果守护进程由于某种原因停止工作,定时器将触发并重启机器。然而,在没有额外硬件的情况下,watchdog 无法从每一种可能的挂起中恢复。例如,如果中断系统本身挂起,软件 watchdog 也无济于事。

WATCHDOG 的功能及其由来

在启动时,守护进程打开 watchdog 设备(主设备号为 10,次设备号为 130 的字符设备),启动 watchdog 进程——一个无限循环,其中守护进程交替写入 watchdog 设备以刷新定时器,然后休眠 10 秒。如果守护进程被杀死,设备文件将被关闭,定时器将再次被禁用。

最初,我编译了 Alan Cox 在源代码树中给出的示例,以便能够启动、刷新和停止软件 watchdog 守护进程。由于我始终运行最新的内核和 libc 版本,并依赖机器保持运行以处理电子邮件,因此即使是这个简单的版本也证明对我非常有用。

随着时间的推移,添加了更多功能。首先,WATCHDOG 变成了一个真正的守护进程,因为它会自动 fork 成后台进程,并隐藏其进程 ID。然后,由于 WATCHDOG 执行一项关键任务,因此实现了对标准 syslog 设施的日志记录,以及一些用户友好的选项

  • 每次进程唤醒时,日志记录都在详细模式下完成。

  • 睡眠间隔可以从命令行设置。

  • 每次进程更新定时器时,文件系统都会同步。

  • watchdog 设备名称可以在命令行上选择。

这个简陋的版本随后作为 Debian 软件包发布,以便更多人有机会使用并测试它。下一步是实现一些增强功能,即每次进程唤醒时测试用户命名文件可访问性的能力。此功能允许 WATCHDOG 捕获通过 NFS 或类似的远程文件系统方式挂载大部分或全部目录树的机器的问题——即使本地机器运行正常,此连接也可能挂起。由于这种挂起可能会导致巨大问题,WATCHDOG 守护进程会在每次唤醒时尝试访问此挂载上的一个文件。如果连接断开,它将无法刷新定时器,系统将重新启动。当任何调用返回错误消息时,可以指示 WATCHDOG 启动软启动而不是正常的硬复位。

在 WATCHDOG 开发的这个阶段,我将守护进程作为 1.0 版本发布到所有 Debian 档案和 tsx-11.mit.edu。

自 1.0 版本以来发生了哪些变化?

随着更多人使用 WATCHDOG,一些问题被遇到并修复,我开始着手解决仍然困扰我的一个问题。有时进程表变得非常满,以至于无法启动更多进程,因此我更改了 WATCHDOG,使其在每次唤醒时检查进程表。如果表已满,系统将重新启动。在这种情况下进行硬复位似乎不是一个好主意,因此,WATCHDOG 启动了完全关机。此操作也带来了一个问题,因为尽管 WATCHDOG 尝试杀死所有进程,进程表仍可能保持满状态。例如,当进程表不为空时,无法启动关机二进制文件。为了解决这种情况,WATCHDOG 包含用于完全关机过程的代码,包括以下操作

  • 空闲 init,因此无法启动任何新进程,

  • 杀死所有进程,

  • 将重启记录写入 wtmp,

  • 关闭帐户,

  • 关闭配额,

  • 关闭交换,

  • 卸载所有已挂载的分区,

  • 调用重启。

随着此功能正常工作,2.0 版本于 1996 年 7 月 30 日发布到 tsx-11.mit.edu 和每个 Debian 镜像。

当然,还有更多想法需要实现。如果任何人需要与本文描述的检查不同的检查,请写信给我 meskes@debian.org。

Michael Meskes 在撰写博士论文时首次接触 Linux。自 1994 年以来,他一直参与内核和 C 库的测试和错误修复。自 1995 年以来,他为 Debian GNU/Linux 维护了多个软件包。他喜欢职业足球,特别是旧金山 49 人队。他欢迎您发送评论至 meskes@debian.org。

加载 Disqus 评论