[英]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.h
和drivers/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.