我正在为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处理程序需要做更多的事情(即至少警告用户)。
我找不到从用户空间获取此设置的方法:(感谢任何帮助。
答案 0 :(得分:17)
AHA!在挖掘了内核的linux/watchdog.h
和drivers/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)
我认为看门狗设备驱动程序非常适合在嵌入式平台(或至少是受控制的平台)上使用,开发人员可以控制使用哪个内核。
这可以被视为疏忽,但我认为不是。
你可以尝试另外一件事,如果将看门狗构建为可加载模块,卸载它可能会中止关闭?