Watchdog
Le watchdog est le mecanisme de surete qui redemarre automatiquement le node si
la boucle de controle se bloque. Dans leukOS, il est pilote par le daemon C++ via
/dev/watchdog.
Comment ca fonctionne
- Au demarrage, le daemon ouvre
/dev/watchdoget configure un timeout (15 s par defaut). - Tant que la boucle principale tourne, le daemon envoie periodiquement un
signal de rearmement (
feed). - Si la boucle se fige (deadlock, blocage I/O, panic user-space), le rearmement s'arrete.
- A l'expiration du timeout, le watchdog materiel force un reboot de la machine.
Exemples rapides
Exemple 1: fonctionnement nominal
poll_interval_ms = 250watchdog.timeout_s = 15- Le daemon rearmant en continu, aucun reboot n'est declenche.
Exemple 2: blocage de la boucle
- Un thread critique bloque la boucle principale plus de 15 secondes.
- Le
feedne passe plus. - Le watchdog expire et redemarre automatiquement le node.
Exemple 3: arret maitrise
- Lors d'un
SIGTERM/shutdown normal, le daemon executestop(). - Le watchdog est desarme/ferme proprement pour eviter un reboot parasite.
Integration dans l'OS leukOS
Le watchdog n'est pas un service SysV separe. Il est integre dans le cycle de vie
du daemon S90leukos-node:
- Init BusyBox lance
S90leukos-node. - Le daemon initialise ses modules, dont
Watchdog. - La boucle de controle appelle
watchdog.feed()a chaque cycle. - En cas de blocage, le materiel reprend la main.
Cela garantit que la protection couvre la logique metier reelle (relais, vannes, compteurs, scheduler), pas seulement l'existence d'un process.
Configuration
Dans /etc/leukos/node.json:
{
"watchdog": {
"enabled": true,
"timeout_s": 15
}
}
enabled: active/desactive le mecanisme.timeout_s: delai max sansfeedavant reboot.
Cas de figure geres dans l'OS
- Blocage de la boucle principale du daemon.
- Deadlock applicatif empechant l'avancement du controle.
- Blocage long sur une ressource critique qui stoppe le cycle.
- Degradation temporaire reseau/MQTT: pas de reboot tant que la boucle tourne.
Cas non geres directement:
- Corruption materielle lourde (alim instable, RAM defectueuse).
- Kernel panic immediate avant reprise du daemon.
- Boucle applicative vivante mais logique metier incorrecte (le watchdog ne valide pas la justesse fonctionnelle, seulement la vivacite).
Bonnes pratiques
- Garder
timeout_splus grand que le pire temps d'un cycle normal. - Eviter les operations bloquantes non bornees dans la boucle principale.
- Utiliser des timeouts reseau/serie explicites.
- Surveiller les reboots repetes via logs/heartbeat pour distinguer un crash reel d'un faux positif de timeout.