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