第一步:加载软看门狗模块
bash
# 查看当前是否已加载看门狗
lsmod | grep wdt
# 加载内核自带的软看门狗驱动
modprobe softdog
# 确认加载成功
lsmod | grep softdog
# 输出示例:softdog 16384 0
# 确认设备文件已生成
ls -la /dev/watchdog*
# 输出示例:crw------- 1 root root 10, 130 /dev/watchdog
# 或 /dev/watchdog0
第二步:查看当前状态
bash
# 查看系统日志,确认看门狗已初始化
dmesg | grep -i watchdog
# 输出示例:
# [xx] softdog: Software Watchdog Timer: 0.08 initialized.
# [xx] softdog: initialized. soft_noboot=0 soft_margin=60 sec soft_panic=0
# 这里 soft_margin=60 表示超时 60 秒
# soft_noboot=0 表示超时后会重启系统
第三步:写一个喂狗程序
用 Python 最简单,不需要编译:
bash
#!/usr/bin/env python3
"""
看门狗喂狗程序
每30秒喂一次狗,超时时间60秒------只要超过60秒没喂,系统就重启
"""
import sys
import time
import signal
WATCHDOG_DEV = "/dev/watchdog"
def main():
# 打开看门狗设备
try:
fd = open(WATCHDOG_DEV, "w")
except PermissionError:
print("请用 sudo 运行此脚本")
sys.exit(1)
print(f"看门狗已打开: {WATCHDOG_DEV}")
print("每15秒喂狗一次,按 Ctrl+C 停止(停止后系统会在60秒内重启)")
# 优雅退出时关闭看门狗(可选,看试验需求)
def graceful_exit(sig, frame):
print("\n收到信号,正在关闭看门狗...")
try:
# 写入魔术字符 V 可以安全关闭 softdog
fd.write("V")
fd.flush()
print("看门狗已安全关闭")
except:
pass
fd.close()
sys.exit(0)
signal.signal(signal.SIGINT, graceful_exit)
signal.signal(signal.SIGTERM, graceful_exit)
# 主循环:定期喂狗
while True:
try:
fd.write("X") # 写入任意非V字符就是喂狗
fd.flush()
print(f"[{time.strftime('%H:%M:%S')}] 喂狗成功")
time.sleep(15)
except OSError as e:
print(f"喂狗失败: {e}")
break
if __name__ == "__main__":
main()
第四步:运行试验
4.1 安全重启测试
bash
# 运行喂狗程序
python3 watchdog_test.py
# 输出:
# 看门狗已打开: /dev/watchdog
# 每15秒喂狗一次,按 Ctrl+C 停止(停止后系统会在60秒内重启)
# [14:30:00] 喂狗成功
# [14:30:15] 喂狗成功
# [14:30:30] 喂狗成功
# 此时按 Ctrl+C,程序优雅退出,写入 'V' 关闭看门狗
# 系统不会重启
4.2 模拟死机测试(核心试验)
再开一个终端,模拟程序异常崩溃
bash
# 先启动喂狗程序
sudo python3 watchdog_test.py &
# 记下它的 PID
ps aux | grep watchdog_test
# 模拟程序死机:直接杀掉进程
sudo kill -9 <PID>
# 或者用这个更强力的方法:
sudo killall -9 python3
观察现象
bash
# 在一个独立终端里持续监控
watch -n 1 dmesg | tail -3
你会看到类似这样的日志:
bash
softdog: WDT timeout, initiating system reboot
reboot: Restarting system
然后系统会在 60 秒后自动重启(60 秒是默认超时时间)。
第五步:调参
修改超时时间
bash
# 卸载模块
sudo rmmod softdog
# 重新加载,设置超时为 10 秒(方便快速看到效果)
sudo modprobe softdog soft_margin=10
# 验证
cat /sys/module/softdog/parameters/soft_margin
# 输出: 10
检查 systemd 是否在占用看门狗
银河麒麟的 systemd 默认可能已经打开了看门狗:
bash
# 查看 systemd 的看门狗配置
systemctl show | grep -i watchdog
# 如果 RuntimeWatchdogUSec 有值,说明 systemd 在用
# 此时你的程序打不开 /dev/watchdog
# 临时关掉 systemd 的看门狗(需要重启生效)
# 编辑 /etc/systemd/system.conf
# 注释掉 RuntimeWatchdogSec