代码之家  ›  专栏  ›  技术社区  ›  Tim Post Samir J M Araujo

Linux软件看门狗

  •  14
  • Tim Post Samir J M Araujo  · 技术社区  · 17 年前

    我正在为Linux编写一个系统监视器,希望包含一些看门狗功能。在内核中,您可以将看门狗配置为即使/dev/watchdog关闭也能继续运行。换句话说,如果我的守护进程正常退出并关闭/dev/watchdog,系统仍将在59秒后重新启动。这可能是用户想要的行为,也可能不是。

    我需要让我的守护进程知道这个设置,因为它会影响我处理SIGINT的方式。如果设置为on,我的守护进程需要(最好)在退出时启动有序关机,或者(至少)警告用户系统将很快重新启动。

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

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

    根据内核的配置,关闭该文件可能会停止倒计时,也可能不会停止倒计时。从文件中:

    看门狗可以不受干扰地停止 /dev/watchdog已正确关闭, 除非你的内核是用 CONFIG\u WATCHDOG\u NOWAYOUT选项

    我需要能够判断CONFIG_WATCHDOG_NOWAYOUT是否是从用户空间守护进程中设置的,以便我能够以不同的方式处理所述守护进程的关闭。换言之,如果该设置为高,则简单:

    # /etc/init.d/mydaemon stop
    

    ... 将在59秒内重新启动系统,因为不再有任何内容写入/dev/watchdog。因此,如果设置为高,我的SIGINT处理程序需要做额外的事情(即至少警告用户)。

    我找不到从用户空间获取此设置的方法:(感谢您的帮助。

    3 回复  |  直到 6 年前
        1
  •  18
  •   Tim Post Samir J M Araujo    13 年前

    啊哈!在挖掘内核的 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 . 所以,当正常终止时,我必须向 /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 所以 open() 块(因此检测忙卡)。

    WDIOF_MAGICCLOSE 如果不支持,则应假定软看门狗配置了NOWAYOUT。记住,只是 开放 设备已成功启动倒计时。如果您所做的只是探测它是否支持magic close,并且它支持magic close,那么 魔法关闭它

        2
  •  3
  •   Javier    17 年前

    看门狗可以防止由于软件崩溃或硬件故障而硬锁定系统。

        3
  •  -2
  •   MarkR    17 年前

    我认为watchdog设备驱动程序实际上是为了在嵌入式平台(或者至少是控制良好的平台)上使用,在这些平台上,开发人员可以控制正在使用的内核。

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

    推荐文章