14

我正在为 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 处理程序需要做额外的事情(即至少警告用户)。

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

4

3 回答 3

18

啊哈!在挖掘内核的linux/watchdog.hand之后drivers/watchdog/softdog.c,我能够确定 softdogioctl()接口的功能。查看它在中宣布的功能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_NONBLOCKso ioctl()notopen()块打开(因此检测到繁忙的卡)。

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

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

于 2009-02-18T05:44:14.423 回答
3

看门狗可防止由于软件崩溃或硬件故障而对系统进行硬锁定。

你需要的是一个守护进程监控守护进程(dmd)。检查“监控”

于 2009-02-18T04:19:57.560 回答
-2

我认为看门狗设备驱动程序确实适用于嵌入式平台(或至少是控制良好的平台),开发人员将可以控制正在使用的内核。

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

您可以尝试的另一件事是,如果看门狗是作为可加载模块构建的,那么卸载它可能会中止关机?

于 2009-02-20T08:30:10.360 回答