Linux软件看门狗

时间:2009-02-18 04:13:20

标签: c linux watchdog

我正在为Linux编写系统监视器,并希望包含一些监视功能。在内核中,即使/ dev / watchdog关闭,您也可以将监视程序配置为继续运行。换句话说,如果我的守护进程正常退出并关闭/ dev / watchdog,系统仍会在59秒后重新启动。这可能是也可能不是用户的理想行为。

我需要让我的守护进程知道这个设置,因为它会影响我处理SIGINT的方式。如果设置已启用,我的守护程序将需要(最好)在退出时启动有序关闭,或者(至少)警告用户系统将很快重启。

有没有人知道从用户空间获取此设置的方法?我没有在sysconf()中看到任何东西来获取值。同样,我需要能够判断软件看门狗是否已启用。

修改

Linux提供了一个非常简单的看门狗界面。一个进程可以打开/ dev / watchdog,一旦打开设备,内核将开始60秒倒计时重启,除非一些数据被写入该文件,在这种情况下时钟重新设置。

根据内核的配置方式,关闭该文件可能会也可能不会停止倒计时。来自文档:

  

看门狗可以在没有的情况下停止   如果设备导致重启   / dev / watchdog正确关闭,   除非你的内核编译   CONFIG_WATCHDOG_NOWAYOUT选项   启用。

我需要能够判断是否在用户空间守护程序中设置了CONFIG_WATCHDOG_NOWAYOUT,以便我可以不同地处理所述守护程序的关闭。换句话说,如果该设置很高,则简单:

# /etc/init.d/mydaemon stop

...将在59秒内重启系统,因为没有任何内容正在写入/ dev / watchdog。所以,如果它设置为高,我的SIGINT处理程序需要做更多的事情(即至少警告用户)。

我找不到从用户空间获取此设置的方法:(感谢任何帮助。

3 个答案:

答案 0 :(得分:17)

AHA!在挖掘了内核的linux/watchdog.hdrivers/watchdog/softdog.c之后,我能够确定软件狗ioctl()接口的功能。查看它在struct watchdog_info中宣布的功能:

static struct watchdog_info ident = {
                .options =              WDIOF_SETTIMEOUT |
                                        WDIOF_KEEPALIVEPING |
                                        WDIOF_MAGICCLOSE,
                .firmware_version =     0,
                .identity =             "Software Watchdog",
        };

确实支持(似乎)覆盖CONFIG_WATCHDOG_NOWAYOUT的魔术关闭。因此,当正常终止时,我必须将一个字符'V'写入/dev/watchdog 然后关闭它,计时器将停止计数。

ioctl()文件描述符上的一个简单/dev/watchdog,要求WDIOC_GETSUPPORT,可以确定是否设置了此标志。伪代码:

int fd;
struct watchdog_info info;

fd = open("/dev/watchdog", O_WRONLY);
if (fd == -1) {
   perror("open");
   // abort, timer did not start - no additional concerns
}

if (ioctl(fd, WDIOC_GETSUPPORT, &info)) {
    perror("ioctl");
    // abort, but you probably started the timer! See below.
}

if (WDIOF_MAGICCLOSE & info.options) {
   printf("Watchdog supports magic close char\n");
   // You have started the timer here! Handle that appropriately.
}

使用硬件监视程序时,您可能希望使用O_NONBLOCK打开ioctl()而不是open()块(因此检测到忙碌的卡)。

如果不支持WDIOF_MAGICCLOSE,则应假设软看门狗配置为NOWAYOUT。请记住,只需打开设备就会成功开始倒计时。如果你所做的只是探究它是否支持魔法关闭而且确实如此,那么魔法将它关闭。否则,请务必处理您现在有一个正在运行的监视器的事实。

不幸的是,如果没有实际启动它,没有真正的方法可以确定,至少不是我能找到的。

答案 1 :(得分:3)

监视器可以防止系统硬锁,原因可能是软件崩溃或硬件故障。

您需要的是守护程序监视守护程序(dmd)。检查'monit'

答案 2 :(得分:-2)

我认为看门狗设备驱动程序非常适合在嵌入式平台(或至少是受控制的平台)上使用,开发人员可以控制使用哪个内核。

这可以被视为疏忽,但我认为不是。

你可以尝试另外一件事,如果将看门狗构建为可加载模块,卸载它可能会中止关闭?