当前位置:  开发笔记 > 运维 > 正文

Linux软件看门狗

如何解决《Linux软件看门狗》经验,为你挑选了1个好方法。

我正在为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处理程序需要做其他事情(即至少警告用户).

我找不到从用户空间获取此设置的方法:(任何帮助表示赞赏.



1> Tim Post..:

AHA!通过内核的挖掘后linux/watchdog.hdrivers/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.请记住,只需成功打开设备即可开始倒计时.如果你正在做的就是探究它是否支持魔法近距离,那么魔法就会关闭它.否则,请务必处理您现在拥有正在运行的监视程序的事实.

不幸的是,没有真正的方法可以确切地知道如果没有实际启动它,至少不是我能找到的.


API规范中Magic Close和IOCTL的详细信息确认了上述注释,但提供了更多背景细节.例如,参见[this](http://www.mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt).首先找到[这里](http://stackoverflow.com/a/2020516/939250).
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有