在通常情况下,无论是arm设备还是正常的x64的PC,Linux下都会有一个叫/dev/watchdog的设备
据说,内核会自动喂他,但是经过咩咩多次的死机经验来看,他喂了跟没喂一样,优先级过高了,系统卡死了也不重启
还有安装一个叫watchdog的程序来喂,依然是实时性过高,导致卡死不重启
据说,超时时间是1分钟,但实测在s905l和s905l3a上,30秒喂一次都会重启,20秒一次就没问题,因此就有了下面两种喂狗方式:

crontab法

sudo crontab -e修改root的计划任务,加入这行

* * * * * echo 1 > /dev/watchdog; sleep 20; echo 1 > /dev/watchdog; sleep 20; echo 1 > /dev/watchdog

方便是很方便,缺点也显而易见,在dmesg查看系统日志时会看到大量的

watchdog: watchdog0: watchdog did not stop!

但是这也是有效的,crontab的优先级并不高,系统卡死的时候crontab会不准时或卡死堆积起来同时执行多次

Python法

由于Linux大量依赖python的程序,所以Linux中一般都自带python3或者python2.7
鉴于可能出现系统负载爆炸但是这程序还活着的情况,顺便监视一下5分钟平均负载
新建linuxWatchdog.py,写入内容

# coding=utf-8
# Linux Watchdog
# v1.0
# Sparkle 20230130
import os, time
with open('/dev/watchdog', 'w') as d, open('/proc/loadavg', 'r') as l:
    while True:
        d.write("1")
        d.flush()
        l.seek(0)
        if float(l.read().split()[1]) > 200:
            break
        time.sleep(15)

编辑/etc/rc.localexit 0上加入

nice -n -19 python3 /root/linuxWatchdog.py &

这个程序会每15秒喂一次狗,并且使用最低的系统优先级来运行,尽可能做到卡死时他先死

网络检查

比如像cm311-1a运行armbian的情况下,网口在开机后可能会抽风,导致没有网络,需要重启或是插拔才能正常工作,那么就可以在crontab中加一条

*/5 * * * * ping -W 30 -c 1 -q baidu.com >/dev/null;if [ $? != 0 ];then reboot;fi

这样每5分钟都会ping一次检查网络是否连通,否则就重启