我正在为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处理程序需要做其他事情(即至少警告用户).
我找不到从用户空间获取此设置的方法:(任何帮助表示赞赏.
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.请记住,只需成功打开设备即可开始倒计时.如果你正在做的就是探究它是否支持魔法近距离,那么魔法就会关闭它.否则,请务必处理您现在拥有正在运行的监视程序的事实.
不幸的是,没有真正的方法可以确切地知道如果没有实际启动它,至少不是我能找到的.