2009-02-18 141 views
14

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

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

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

编辑:

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

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

看门狗可以在不引起 重启停止,如果设备 的/ dev /看门狗正确关闭,除非 你的内核编译 启用CONFIG_WATCHDOG_NOWAYOUT选项 。

我需要能够判断CONFIG_WATCHDOG_NOWAYOUT是否在用户空间守护进程中设置,以便我可以以不同方式处理关闭所述守护进程。换句话说,如果设置为高,一个简单的:

# /etc/init.d/mydaemon stop 

...会重新启动59秒的系统,因为没有什么是不再写入到/ dev /看门狗。所以,如果它的设置很高,我的SIGINT处理程序需要做额外的事情(即警告用户至少)。

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

回答

17

AHA!通过内核的linux/watchdog.hdrivers/watchdog/softdog.c挖后,我能够确定加密狗ioctl()界面的能力。纵观它在0123中宣布的功能:

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。请记住,只需开放设备成功开始倒计时。如果你所做的只是探索它是否支持魔法关闭而已,那么魔法关闭它。否则,一定要处理你现在有一个正在运行的看门狗的事实。

不幸的是,没有真正的方法可以肯定地知道没有真正启动它,至少不是我能找到的。

+2

API规范中Magic Close和IOCTL的详细信息可以确认上面的注释,但会提供更多背景细节。例如,请参阅[this](http://www.mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt)。首先发现[这里](http://stackoverflow.com/a/2020516/939250)。 – 2012-01-25 16:15:10

3

对硬锁定系统,或者是因为一个软件崩溃或硬件故障。

看门狗卫士

你需要的是一个守护进程监测守护进程(DMD)。检查“monit的”

+1

我正在写一个DMD,专门用于准虚拟化的xen客人,它也有一些nagios风格的功能(sysinfo数据被写入xenbus,它可以被特权域监视)。请参阅该问题的其他编辑,我还不够清楚。 – 2009-02-18 04:29:30

-2

我认为看门狗设备驱动程序确实适用于嵌入式平台(或者至少控制良好的嵌入式平台),开发人员可以控制哪些内核正在使用。

这可能被认为是一个疏忽,但我认为它不是。

另一件你可以尝试的东西,如果看门狗是作为一个可加载模块构建的,卸载它可能会中止关闭?

+1

如果软件狗是一个可加载的模块,生活变得非常简单,因为它在加载时也接受参数(是的,卸载会停止它)。问题是,在嵌入式系统上(正如我所说的那样),您经常会看到所有内核都是静态对象的单片内核。 – 2009-02-21 07:48:04