Linux软件看门狗

我正在为Linux编写一个系统监视器,并希望包含一些看门狗function。 在内核中,即使closures了/ dev / watchdog,也可以configuration看门狗。 换句话说,如果我的守护进程正常退出并closures了/ dev / watchdog,则系统在59秒后仍会重新启动。 这对于用户而言可能是或者可能不是期望的行为。

我需要让我的守护进程知道这个设置,因为它会影响我如何处理SIGINT。 如果这个设置是打开的,我的守护进程需要(最好)在退出时启动一个有序closures,或者(至less)警告用户系统很快就会重启。

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

编辑:

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

根据configuration内核的方式,closures该文件可能会或可能不会停止倒计时。 从文档:

如果设备/ dev / watchdog被正确closures,看门狗可以停止而不会导致重新启动,除非您的内核是在启用了CONFIG_WATCHDOG_NOWAYOUT选项的情况下编译的。

我需要能够判断CONFIG_WATCHDOG_NOWAYOUT是否在用户空间守护进程中设置,这样我就可以以不同的方式处理closures所有守护进程。 换句话说,如果这个设置很高,一个简单的:

# /etc/init.d/mydaemon stop 

…将在59秒内重新启动系统,因为没有任何信息正在写入/ dev / watchdog。 所以,如果它的设置很高,我的SIGINT处理程序需要做额外的事情(即警告用户至less)。

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

Solutions Collecting From Web of "Linux软件看门狗"

AHA! 在深入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 。 所以,当正常终止时,我必须写一个字符'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。 记住,只要打开设备成功开始倒计时。 如果你所做的只是探索它是否支持魔法关闭,那么魔法就会关闭它 。 否则,一定要处理你现在有一个运行看门狗的事实。

不幸的是,如果没有真正开始,没有办法知道,至少不是我能找到的。

看门狗可以防止系统硬锁,无论是软件崩溃还是硬件故障。

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

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

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

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