28. 看门狗

看门狗(Watchdog)是一种用于监控系统健康状态的机制,它的主要功能是确保系统在发生故障时能够自动恢复或重启,从而提高系统的可靠性和稳定性。

28.1. 工作原理

  • 定期“喂狗”:看门狗通过一个定时器来监控系统的运行,系统需要定期发送一个“喂狗”的信号,表明系统仍在正常运行。如果系统未能按时发送这个信号(可能由于系统崩溃或严重的错误),看门狗会认为系统出现了问题。

  • 超时处理:如果看门狗超时没有接收到“喂狗”信号,它会采取预定义的措施,例如重启系统或执行其他恢复操作,这种机制可以确保系统在遇到不可恢复的错误时自动恢复运行。

28.2. 使用

28.2.1. 喂狗测试

LubanCat-RK3588系列板卡默认已经开启了看门狗,可以直接使用。

应用操作通过/dev/watchdog节点来控制watchdog,示例如下:

1
2
3
4
5
# 写入除大写V以外的任意字符,用户喂狗
echo 1 > /dev/watchdog

# 写入大写V字符,系统自行喂狗
echo V > /dev/watchdog

默认系统会自动喂狗,如果向/dev/watchdog写入除大写V以外的任意字符则需要用户自行喂狗, 如果在44秒内没有继续写入字符进行喂狗,系统将会重启。

28.2.2. 使用shell脚本喂狗

以下示例使用shell脚本10s喂一次狗。

1
2
3
4
5
6
7
#!/bin/bash

while true
do
    echo 1 > /dev/watchdog
    sleep 10
done

28.2.3. 使用C程序喂狗

以下使用C程序10s喂一次狗。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(void)
{
    int fd = open("/dev/watchdog", O_WRONLY);
    int ret = 0;
    if (fd == -1) {
        perror("watchdog");
        exit(EXIT_FAILURE);
    }
    while (1) {
        ret = write(fd, "\0", 1);  // 通过write来喂狗
        if (ret != 1) {
            ret = -1;
            break;
        }
        sleep(10);
    }
    close(fd);
    return ret;
}