C 从用户空间,我如何判断Linux';s软看门狗配置为无出路?

C 从用户空间,我如何判断Linux';s软看门狗配置为无出路?,c,linux,watchdog,C,Linux,Watchdog,我正在为Linux编写一个系统监视器,希望包含一些看门狗功能。在内核中,您可以将看门狗配置为即使/dev/watchdog关闭也能继续运行。换句话说,如果我的守护进程正常退出并关闭/dev/watchdog,系统仍将在59秒后重新启动。这可能是用户想要的行为,也可能不是 我需要让我的守护进程知道这个设置,因为它会影响我处理SIGINT的方式。如果设置为on,我的守护进程需要(最好)在退出时启动有序关机,或者(至少)警告用户系统将很快重新启动 有人知道从用户空间获取此设置的方法吗?我在syscon

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

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

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

编辑:

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

根据内核的配置,关闭该文件可能会停止倒计时,也可能不会停止倒计时。从文件中:

看门狗可以不受干扰地停止 如果设备发生故障,将导致重新启动 /dev/watchdog已正确关闭, 除非你的内核是用 CONFIG\u WATCHDOG\u NOWAYOUT选项 启用

我需要能够判断CONFIG_WATCHDOG_NOWAYOUT是否是从用户空间守护进程中设置的,以便我能够以不同的方式处理所述守护进程的关闭。换言之,如果该设置为高,则简单:

# /etc/init.d/mydaemon stop
。。。将在59秒内重新启动系统,因为不再有任何内容写入/dev/watchdog。因此,如果设置为高,我的SIGINT处理程序需要做额外的事情(即至少警告用户)


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

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


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

AHA!在深入研究内核的
linux/watchdog.h
drivers/watchdog/softdog.c
之后,我能够确定softdog
ioctl()的功能
接口。查看它在
struct watchdog\u info
中宣布的功能:

static struct watchdog_info ident = {
                .options =              WDIOF_SETTIMEOUT |
                                        WDIOF_KEEPALIVEPING |
                                        WDIOF_MAGICCLOSE,
                .firmware_version =     0,
                .identity =             "Software Watchdog",
        };
它确实支持一个神奇的关闭(似乎)覆盖
CONFIG\u WATCHDOG\u NOWAYOUT
。因此,当正常终止时,我必须向
/dev/WATCHDOG
写入一个字符“V”,然后关闭它,计时器将停止计数

在文件描述符上使用一个简单的
ioctl()
询问
WDIOC\u 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
so
ioctl()
not
open()
块打开(因此检测到忙卡)

如果不支持
WDIOF_MAGICCLOSE
,则应假定软看门狗配置了NOWAYOUT。记住,只要打开设备即可成功启动倒计时。如果您所做的只是探测它是否支持magic close,然后magic close。否则,请务必处理您不支持的事实我们有一只正在奔跑的看门狗


不幸的是,在没有实际启动的情况下,没有真正的方法可以确定,至少我找不到。

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

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


还有一件事你可以试试,如果看门狗是作为一个可加载的模块构建的,卸载它可能会中止关机?

我正在编写一个DMD,专门用于半虚拟化的xen客户机,它也有一些nagios风格的功能(sysinfo数据被写入xenbus,在那里它可以被特权域监视)。请参阅对问题的其他编辑,我不够清楚。如果softdog是一个可加载的模块,那么它在加载时也会接受参数(是的,卸载会阻止它)。问题是,在嵌入式系统上(正如你所说,我正在处理它)你经常会看到所有东西都是静态对象的单片内核。我认为这实际上有点疏忽,这就是为什么他们后来改变了软看门狗,使其服从magic close字符的原因。例如,向设备写入一个“V”,然后关闭它,总是会停止倒计时。API spec conf中有关magic close和IOCTL的详细信息irm注释,但提供了更多背景详细信息。请参阅示例。首次找到。