Watchdog (chien de garde)

Avec un système (Remote SDR) tournant Ă  distance H24, nous ne sommes pas Ă  l’abri d’un plantĂ© de système et surtout d’une perte du contrĂ´le Ă  distance. Pour y remĂ©dier, il est possible de mettre en place un « Watchdog » qui test en permanence la liaison vers internet et redĂ©marre le système en cas de non-rĂ©ponse au bout d’un certain temps.

Kernel Watchdog

Le Watchdog (chien de garde) du noyau Linux est utilisĂ© pour surveiller si un système est en cours d’exĂ©cution. Il est censĂ© redĂ©marrer automatiquement les systèmes suspendus en raison d’erreurs logicielles irrĂ©cupĂ©rables. Le module de surveillance est spĂ©cifique au matĂ©riel ou au processeur utilisĂ©.

Pour tester la possibilitĂ© d’utiliser cette fonctionnalitĂ© sur votre système, ouvrez une fenĂŞtre terminale en mode root et tapez :

echo 1 > /dev/watchdog

Votre système va rebooter au bout de 15 s en gĂ©nĂ©ral. Cela fonctionne sur les Raspberry Pi 4, les Orange Pi etc…

Il suffit d’Ă©crire un bout de code qui toute les 5 s par exemple va exĂ©cuter cette mĂŞme commande qui relance le compteur de 15 s et Ă©vite le reboot sauf si cela s’arrĂŞte.

Dans le cas ci-après on va tester la prĂ©sence du rĂ©seau ethernet et relancer le watchdog que s’il est prĂ©sent. Ainsi en cas de blocage du WIFI ne permettant plus de se connecter Ă  distance, le système va rebooter. Pour cela, on va installer la bibliothèque ping3 avec:

pip3 install ping3

Ci-après un petit code en python3 qui va exciter le watchdog toute les 5s sauf si pas d’internet.

#!/usr/bin/python3        

import os
import time
from ping3 import ping

adr_start = "/home/Last_boot.txt"
periode_to_test_internet=20 #20*5s
internet_ok=True

def myping(host):
    resp = ping(host)
    if resp == False:
        return False
    else:
        return True


m="Last Boot : " +time.asctime() 
file=open(adr_start,"w")
file.write(m+"\r\n") 
file.close()

delay_watchdog = 2*periode_to_test_internet # augmentation délai au démarrage

try:
    print ("Press CTRL+C to exit")
    while True:
        time.sleep(5)
        if delay_watchdog>0:
            delay_watchdog=delay_watchdog-1
        else :
            internet_ok =False
            delay_watchdog = periode_to_test_internet
            ok1 = myping("www.google.com")
            ok2 = myping("192.168.0.254")
            if ok1 == True or ok2 == True :
                internet_ok = True
        if internet_ok and delay_watchdog < periode_test_internet:
            os.system("echo 1 > /dev/watchdog") # Excite the watchdog 
                
except KeyboardInterrupt:
    print (" Bye.")
                

Le test internet ne se fait pas immĂ©diatement pour ne pas surcharger le système, et donner le temps de reprendre la main si votre programme plante, car cela peut gĂ©nĂ©rer une boucle infernale oĂą votre système n’arrĂŞte pas de rebooter. A chaque reboot, on Ă©crit l’heure dans un fichier pour avoir la date du dernier dĂ©marrage.

Installation de l’application « Watchdog »

Une autre solution est d’installer un logiciel qui surveille les fonctionnalitĂ©s de votre carte comme la prĂ©sence du rĂ©seau ethernet et d’autres paramètres. Il lancera un processus de reboot si besoin. Sur un Orange Pi ou un Raspberry Pi, ouvrir par ssh un terminal et tĂ©lĂ©charger l’application watchdog prĂ©cĂ©dĂ© de ‘sudo’ si vous n’ĂŞtes pas en ‘root’.

sudo apt install watchdog

Une fois installé, ouvrir le fichier de configuration qui permet de faire de nombreux tests périodiques.

nano /etc/watchdog.conf

Ici, on va se limiter Ă  tester la liaison ethernet vers l’extĂ©rieur pour ĂŞtre sĂ»r de toujours pouvoir accĂ©der Ă  distance Ă  son Orange PI ou Raspberry Pi qui fait tourner ‘Remote SDR’. Il faut dĂ©finir certains paramètres.

interval = 10

C’est un intervalle de mesure en secondes qui doit ĂŞtre infĂ©rieure au time_out hardware de votre système (en gĂ©nĂ©ral 15 s). On ne va pas mettre des valeurs trop faibles non plus, il n’est pas nĂ©cessaire de tester le rĂ©seau toutes les secondes.

On va mesurer plusieurs fois avant de décréter le système en panne. Ici 360s.

retry-timeout = 360

Comme mesure, on va tester 2 adresses ip. Par exemple le dns de google et l’adresse de la box en interne. Il faut choisir des adresses susceptibles de fonctionner en permanence.

ping = 8.8.8.8
ping = 192.168.0.254

Il faut dĂ©finir si la liaison ethernet se fait par le rĂ©seau cablĂ© en gĂ©nĂ©ral ‘eth0’

Si l’on passe par le wifi, c’est en gĂ©nĂ©ral wlan0.

ifconfig donne le détail des connexions.

interface = eth0

Sauvegarder le fichier avec un CTRL-X

Lancer le service

sudo service watchdog start

Tester le service

sudo service watchdog status

Il ne vous reste plus qu’Ă  couper la liaison Ethernet 10 mn et voir comment rĂ©agit le système.

F1ATB André

Ham Radio - Home automation - Photovoltaic