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.
Commentaires récents