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:

pip 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 = periode_to_test_internet

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 :
            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.