繁体   English   中英

从用户空间,如何判断Linux的软看门狗是否配置了无路可走?

[英]From userspace, how can I tell if Linux's soft watchdog is configured with no way out?

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

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

啊哈! 在深入研究内核的linux/watchdog.hdrivers/watchdog/softdog.c ,我能够确定 softdog 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的魔术关闭。 因此,在正常终止时,我必须向/dev/watchdog写入一个字符“V”,然后关闭它,计时器将停止计数。

一个简单的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。 请记住,只需成功打开设备即可开始倒计时。 如果您所做的只是探索它是否支持 magic close 并且确实如此,那么magic close it 否则,一定要处理这样一个事实,即您现在有一个正在运行的看门狗。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM