Il s'agit du premier des « nouveaux » chiens de garde matériels « améliorés » pour l'ordinateur monocarte Raspberry Pi hôte du système domotique. Le chien de garde est est lui-même un Raspberry Pi. Étant donné que Raspbian Buster fonctionne sur tous les modèles du Raspberry Pi, tout modèle pourrait être le chien de garde et tout modèle pourrait être le serveur Pi surveillé. Pour réduire les coûts, un Raspberry Pi Zero s'impose. Cependant, si le chien de garde doit envoyer un courriel lors du redémarrage du serveur surveillé, il doit pouvoir communiquer sur le réseau. Dans ce cas, un Raspberry Pi Zero W est probablement le choix le plus économique. Comme je n'ai pas de Pi Zero, un ancien Raspberry Pi 1 est utilisé comme succédané.
Table of contents
- Montage du chien de garde
- Réglage du serveur surveillé
- Réglage du chien de garde
- Minutage
- Validation
Montage du chien de garde
Pour faire mieux qu'avec le chien de garde pour plateforme d'extraction de cryptomonnaie, le nouveau chien de garde doit être en mesure d'arrêter correctement le serveur et d'effectuer une réinitialisation matérielle uniquement si cet arrêt a échoué. Cela signifie que notre temporisateur de surveillance aura une première connexion de sortie pour lancer un arrêt correct lorsque nécessaire. Il lui faut une seconde connexion pour déclencher une réinitialisation matérielle quand le module d'arrêt n'a pu être lancé. Si l'arrêt est effectué correctement, le second signal de sortie est encore nécessaire pour relancer le serveur et ainsi terminer le redémarrage. Bien sûr, le chien de garde doit être « alimenté » par le serveur. En d'autres termes, le chien de garde doit surveiller une connexion d'entrée pour capter le « signe de vie » du serveur pour utiliser l'autre analogie au sujet des temporisateurs de surveillance. Ainsi, en plus d'une masse commune entre les deux Raspberry Pi, trois autres connexions doivent être effectuées comme indiqué dans le schéma suivant.

| Connexion | Temporisateur | Serveur |
|---|---|---|
| signe de vie | GPIO17 (broche 11) - entrée | GPIO17 (broche 11) - sortie |
| arrêt | GPIO27 (broche 13) - sortie | GPIO27 (broche 13) - entrée |
| réinitialisation | GPIO25 (broche 22) - sortie | RUN - entrée |
| masse | masse (broche 20) | masse (broche 20) |
Les trois connexions doivent utiliser des broches d'entrée-sortie à usage général en évitant les broches à usage spécial qui pourraient être utilisées par un Pi ou l'autre pour communiquer avec d'autres périphériques. Par exemple, les broches GPIO2 et GPIO3 (signal de données et signal d'horloge I2C respectivement) du serveur ne peuvent être utilisé car une horloge matérielle y est connectée. Même avec cette contrainte, il existe de nombreuses connexions possibles; mon choix fut dicté par des considérations esthétiques pour que montage soit simple et symétrique.
Il existe de nombreuses broches de masse sur le connecteur E/S du Raspberry Pi. Peu importe quelles broches sont utilisée, il faut connecter la masse des deux Raspberry Pi. Sauf pour le Raspberry Pi 3 A+ et B+, le petit connecteur à deux broches nommé P2, P6, ou RUN ou le connecteur de trois broches libellé RUN GLOBAL_EN du modèle 4 ont également une broche mise à terre qui pourrait être utilisée. En aucun cas faut-il relié la broche 1 (3,3 volts) des deux appareils. De même, si les deux Raspberry Pi sont alimentés à partir de sources différentes, ne connectez pas ensemble les broches 2 et 4 (5 volts) des deux appareils.
Un bouton-poussoir normalement ouvert est également placé entre le signal d'arrêt et la masse. De cette façon, il est possible d'initier manuellement un arrêt du serveur Pi. Un bouton-poussoir semblable est entre le signal de réinitialisation et la masse pour redémarrer manuellement le serveur si tout le reste échoue ou pour redémarrer manuellement le serveur Pi s'il a été arrêté avec une commande telle que halt ou poweroff.
De même, deux boutons poussoirs normalement ouverts sont connectés au chien de garde Pi. Le bouton d'alimenatation, étiquetté 0/1, sera expliquée plus loin. Le bouton-poussoir de réinitialisation entre RUN et la masses redémarre le chien de garde Pi si cela devient nécessaire. Le bouton d'alimentation n'est pas utilisé dans le premier chien de garde dit maigre et moyen, mais c'est un ajout utile, comme expliqué ci-dessous.
Réglage du serveur surveillé
La préparation du Raspberry Pi qui est surveillé par le chien de garde matériel sera divisée en deux parties. Il faut créer un service (un démon ou procéssus) qui s'exécute en arrière plan pour signaler régulièrement au chien de garde que tout fonctionne correctement. Ensuite, le module d'arrêt GPIO doit être inclus dans le noyau et doit être lié à la broche E/S relié au signal d'arrêt. En activant cette broche, le chien de garde pourra arrêter le serveur de manière ordonnée.
Nourir le chien de garde
Le Pi qui est surveillé doit « alimenter » régulièrement le chien de garde. Il le fait en basculant l'état de la broche de sortie « signe de vie ». J'utilise un script Python pour ce faire. Tout d'abord, certains modules requis doivent être installés dans l'environnement virtuel Python pour les utilitaires système.
Environnements Python virtuels :Je préfère utiliser des environnements virtuels pour le développement Python. Il y a plus d'une façon de le faire, celle utilisée ici a été décrite dans un billet plus ancien: Python 3 virtual environments. Dernièrement, je créé systématiquement un environnement virtuel pour les scripts « système » comme décrit dans la section sur les répertoires de travail d'un récent billet sur l'installation de Raspbian. Sur
Pour activer l'environnement virtuel, la commandegoldservercet environnement est appelé.systempy.veest utilisée. Il s'agit d'un alias desource $1/bin/activate, ce qui signifie queve .systempyest la même chose quesource .systempy/bin/activate.
Il est très simple de créer un objet LED avec le module gpiozero qui clignote nominalement une DEL mais qui est en fait le signe de vie requis.
Nourrir le chien de garde à la dure
Déçu que le script pour nourrir le chien de garde soit si simple ? Si trois petites lignes de code vous suffisent, passez à la section suivante, mais si retrousser les manches ne vous fait pas peur, lisez la suite.
Les vrais programmeurs n'utilisent pas de nouveautés comme gpiozero. Donc, si vous l'aviez installé en suivant les instruction de la section précédente, vous pouvez supprimer le module de l'environnement virtuel. Autant supprimer colorzero ce qui a été installé avec gpiozero.
Si vous n'avez pas suivi la démarche de la section précédente, alors démarrez l'environnement virtuel et installez le module RPi.GPIO à ce stade.
Qu'importe comment on est arrivé ici, l'environnement virtuel doit maintenant contenir le module RPi.GPIO.
L'idée est de créer une minuterie qui activera la broche de sortie à des intervalles réguliers. Évidemment, ce cycle doit se répèter indéfiniment. Cependant, les minuteries Python sont des objets plutôt simples ne s'exécutant qu'une fois. Enfin si je dit simple c'est en comparaison aux temporisateurs de Free Pascal qui peuvent déclancher une action qu'une fois ou à répétion. Heureusement, right2clicky a créé RepeatTimer, une classe élégante sous-classe de Timer qui est exactement ce dont nous avons besoin (voir StackOverflow.)
Service signe de vie
Une DEL peut être connectée à la sortie GPIO17 (broche physique 11) pour tester l'un et l'autre des deux scripts élaborés dans la section précédente. N'oubliez pas la résistance de limitation de courant et respectez la polarité de la DEL. Avec la deuxième version, on peut remplacer la DEL en activant l'instruction print dans la fonction toggleHeartbeat. Rendez le script exécutable puis exécutez-le et vérifiez que la DEL clignote pendant deux dixièmes de seconde toutes les cinq secondes ou que toggleHeartbeat est imprimée sur la console toutes les cinq secondes.
Appuyez sur la combinaison de touches CtrlC pour arrêter l'exécution du script. Remarquez comment l'environnement virtuel a été désactivé, mais le script s'est exécuté correctement même si les modules Python requis ne sont pas installés dans le répertoire Python par défaut. C'est parce que la ligne "shebang" #!/home/woopi/.systempy/bin/python, au début du script informe le système qu'il doit utiliser l'interpréteur Python de l'environnement virtuel .systempy pour exécuter le script. Cet interpréteur se trouve dans le répertoire home/woopi/.systempy/bin. Il est important d'ajuster le shebang pour identifier le bon répertoire. Si l'on se trompe, alors bash émettra un message d'erreur.
N'oubliez pas de régler la constante HEARTBEAT_PIN = 17 sur la bonne broche E/S si le montage du chien de garde et du serveur est différent de celui présenté ci-dessus. À mon avis, l'identité de la broche E/S et le chemin de répertoires vers Python sont les deux seules erreurs possibles, à part une faute de frappe, bien sûr. Si le script fonctionne correctement, vous souhaiterez peut-être le protéger en écriture.
Le script doit être exécuté automatiquement à chaque départ du système d'exploitation du Raspberry Pi. Cela peut être réalisé avec une tâche cron effectuée à chaque redémarrage du serveur.
Ajoutez la dernière ligne qu'on peut voir ci-dessous.
Bien que cela soit simple à mettre en place, il est préférable d'exécuter le script en arrière-plan en tant que démon (selon l'ancienne terminologie ou service selon la nouvelle nomeclature Linux). Voici une unité de base pour faire cela dans le système d'initialisation systemd utilisé dans Raspbian.
Créez ce fichier en tant que super utilisateur et enregistrez-le dans le répertoire /etc/systemd/system. Un moyen simple de le faire est de démarrer l'éditeur nano, pour y coller le texte affiché ci-dessus.
Utilisez l'utilitaire systemctl pour démarrer le service, puis pour l'activer afin qu'il soit automatiquement démarré au redémarrage du serveur.
L'intérêt de cette approche est qu'il sera dorénavant facile d'arrêter le système.
Ce sera un bon moyen de tester le chien de garde plus tard. De plus, il est facile de vérifier que le service fonctionne correctement.
Module d'arrêt
Le module d'arrêt, gpio-shutdown a déjà été longuement discuté dans la section 5 d'un article précédent : Démarrage à chaud et à froid du Raspberry Pi. Il n'est pas nécessaire de ressasser le sujet. J'ai apporté trois modifications au fichier de configuration config.txt.
Deux modifications, affichées en bleu, étaient facultatives. Elles activent le mini-UART ainsi que le contrôleur matériel I2C et installe le pilote I2C pour une horloge matérielle utilisant la puce DS3231. Il est réconfortant de voir que l'utilisation de ces périphériques est compatible avec l'ajout nécessaire du module gpio-shutdown indiqué en rouge. Ce dernier surveillera l'entrée GPIO27 et déclenchera un arrêt ordonné chaque fois que cette broche est activée (basculement de HIGH vers LOW) soit avec le bouton-poussoir soit par le chien de garde. Le mini-UART rend possible la connexion série sur les broches physiques 8 et 10 du connecteur E/S du Raspberri Pi. Avec cette connexion on peut voir plus facilement si un arrêt ordonné se produit ou non. Une fois que le chien de garde fonctionne correctement, l'UART est désactivé car il ralentit légèrement le système.
Cela termine les modifications qui doivent être apportées au serveur.
Réglage du chien de garde
Je présenterai trois versions du script de surveillance Python. La première version rudimentaire émule le chien de garde pour plateforme d'extraction de cryptomonnaie tout en corrigeant les problèmes associés au chien de garde matériel sans en faire plus. Avec la deuxième version, le « chien de garde obéissant », il sera possible d'utiliser son bouton d'alimentation pour arrêter le serveur sans que le chien de garde ne le redémarre. Dans la version finale, le « chien de garde obéissant et aboyeur », enregistre ses actions dans le journal du système et si possible, envoie une notification par courriel lors du redémarrage du serveur.
Comme mentionné dans l'introduction de cette série d'articles, un ancien Raspberry Pi est utilisé comme proxy pour un Raspberry Pi Zero ou Raspberry Pi Zero W qui sont de meilleurs choix en raison de leur taille et de leur prix.
C'était le dernier Raspberry Pi modèle 1 avec seulement deux ports USB et un connecteur E/S à 26 broches. Comme le Zero, il a 512 Mo de mémoire vive. Les deux ont le même système sur puce Broadcom (BCM2835) avec le même processeur ARM à un cœur (ARM1176JZF-S). Le Zero fonctionne à 1 GHz tandis que le modèle 1 a une vitesse d'horloge inférieure de 700 MHz dont la cadence peut être accélérée.
Le système d'exploitation est Rasbian Buster Lite (kernel 4.19) version 2019-09-26 auquel seules quelques modifications ont été apportées. Le nom d'hôte est wdog plutôt que raspberrypi alors que l'utilisateur par défaut est encore nommé pi. L'environnement virtuel Python pour les utilitaires système tels que le chien de garde est nommé .systempy. Pour plus de détails, consultez l'article intitulé Installation and Configuration of Raspbian Buster Lite.
Un adaptateur USB Wi-Fi facilite la vie car il n'y a pas de moyen simple de se connecter au réseau local avec Ethernet dans la pièce où cette expérience est exécutée. Heureusement, l'adaptateur est basé sur la puce RTL8188CUS de Realtek qui prise en charge par Buster.
Le Raspberry Pi Zero n'a pas de capacités réseau conventionnelles, mais je comprends qu'il est possible d'ouvrir des sessions SSH en utilisant une connexion USB entre le Raspberry Pi Zero et un ordinateur de bureau.
Comme toujours, le système d'exploitation a été mis à niveau juste avant de démarrer ce projet.
Comme de plus en plus de modifications sont apportées au système d'exploitation après la mise à jour de l'image de téléchargement par la Fondation Raspberry, la mise à jour prendra plus de temps. Étant donné que l'image avait quatre mois et que le Raspberry Pi a un processeur relativement sous-alimenté, j'ai eu le temps de déjeuner rapidement à ce stade. N'oubliez pas le paramètre -y si vous souhaitez que cette mise à niveau se poursuive sans surveillance.
Chien de garde rudimentaire
L'objectif ici est de reproduire le chien de garde pour plateforme d'extraction de cryptomonnaie tout en surmontant ses principaux inconvénients. Dans cette mesure, ce chien de garde minimal doit
- arrêter le serveur Raspberry Pi correctement si possible,
- minimiser le basculement du signal
RUN, et - permettre au serveur Raspberry Pi de fonctionner correctement même lorsque le chien de garde est éteint.
Le chien de garde sera mis en oeuvre avec un script Python. Encore une fois, le module RPi.GPIO est prérequis qui doit être ajouté dans l'environnement virtuel Python pour les utilitaires système.
Après avoir désactivé l'environnement virtuel, le script a été créé.
Le script, renommé wdog_lm.py pour distinguer les trois versions, peut être téléchargé en cliquant sur le lien, mais voici un moyen rapide d'obtenir le script, de le renommer wdog.py et de le rendre exécutable.
Si le répertoire de l'environnement virtuel n'est pas nommé .systempy les commandes ci-dessus devront être ajustées ainsi que la première ligne "shebang" du script.
S'il n'y avait pas de commentaires, il serait plus évident qu'il s'agit d'un court script avec peu de choses. Chaque fois que le serveur donne un signe de vie, une interruption se produit et son gestionnaire, aliveCallback met à jour l'heure de réception du signal. Le minuteur checkAlives'exécute régulièrementqui et il redémarrera le serveur si le dernier signe de vie est trop vieux.
Les lecteurs attentifs auront remarqué que le code de nettoyage n'a pas été enregistré auprès de atexit comme cela a été fait dans le script précédent. Au lieu de cela, l'instruction pause est insérée dans un bloc try... finally et le code de nettoyage est effectué dans la clause finally dont l'exécution est assurée. Le nettoyage inclut désormais l'annulation du minuteur, sinon la combinaison de touches CtrlC n'arrêtera pas le minuteur. Notons que la classe RepeatTimer présentée ci-dessus est à nouveau utilisée.
Le redémarrage du serveur se fait en deux étapes. Tout d'abord, il est arrêté correctement en activant la broche GPIO du serveur prise en charge par le module gpio-shutdown. Le chien de garde attend alors que l'arrêt soit effectué. Après un délai approprié, le serveur est redémarré en activant sa broche RUN. Cette approche en deux étapes fournit un mécanisme de sécurité intégrée. Si le serveur avait déraillé au point que l'activation de la broche GPIO liée à gpio-shutdown n'a pu arrêter correctement le système d'exploitation, la deuxième étape réinitialisera le système, quite à ce que l'arrêt du système ne soit pas fait dans les règles de l'art.
Notez que lorsque le chien de garde est démarré et même après qu'il redémarre le serveur, le chien de garde n'est pas actif et il ne redémarrera pas le serveur même en l'absence de signes de vie. Le chien de garde doit être activé, ce qui se produit lorsqu'il a reçu un nombre spécifique de pulsations du serveur. C'est exprès. Il est possible de désactiver le service de signe de viesur le serveur et après un redémarrage initial par le chien de garde, ce dernier ne tentera plus de redémarrer le serveur. De même, il est possible de changer le système d'exploitation sur le serveur et le chien de garde n'interférera pas lors de la mise à jour du système d'exploitation et de l'installation des services. Cette fonctionnalité de démarrage implique qu'il n'est pas nécessaire d'attendre la fin du processus de redémarrage du serveur Pi avant de redémarrer le chien de garde. Il attendra patiemment que le « battement cardiaque » du serveur reprenne avant de démarrer la surveillance du serveur. Je pense que c'est une idée astucieuse, mais ce n'est pas la mienne. Il peut être trouvé dans l'utilitaire watchdog de Linux (voir Chien de garde pour le Raspberry Pi et Domoticz ou la documentation man de watchdog).
Une conséquence heureuse de ne pas démarrer le chien de garde tant qu'il n'a pas reçu au moins un signal du système surveillé est qu'il n'a pas d'importance quel appareil est démarré en premier. Malheureusement, il importe de savoir qui est arrêté en premier. Si le serveur Raspberry Pi est fermé en premier et si le chien de garde a été démarré, ce dernier redémarrera le serveur après le délai d'expiration. Peu importe que l'arrêt du serveur soit fait avec un utilitaire de ligne de commande ou avec les boutons de redémarrage ou de réinitialisation. C'était également un problème avec l'ancien chien de garde matériel. La solution consiste à arrêter d'abord le script wdog.py ou d'arrêter le Pi qui agit comme chien de garde en premier.
Chien de garde obéissant
Il existe un moyen d'éviter partiellement le dernier problème. Au lieu d'utiliser les boutons d'arrêt ou de réinitialisation du serveur, le bouton d'alimentation connecté au Pi chien de garde sera utilisé. En effet, au cours de cette phase expérimentale, le bouton marche / arrêt pourra effectuer quatre fonctions différentes selon le nombre de pressions successives.
| Nombre de fois actionné | Fonction | Note |
|---|---|---|
| 1 | Redémarrage du serveur | Le chien de garde reste en marche |
| 2 | Arrêt du serveur | Le chien de garde est en suspens jusqu'à ce que le serveur donne signe de vie |
| 3 | Redémarrage du chien de garde | Sans effet sur le serveur |
| 4 | Arrêt du chien de garde |
Le module gpiozero est ajouté à l'environnement virtuel pour son objet bouton pratique.
Seuls les ajouts apportés au script ~/.syspy/wdog.py sont affichés ci-dessous. Étant donné que le nombre de fois que le bouton est enfoncé rapidement de façon successive doit être compté, une minuterie (la variable globale appelée buttonTimer) est mise à jour chaque fois que le bouton est relâché. Si le bouton est enfoncé avant la fin du délai imparti, le compteur du nombre de fois que le bouton a été enfoncé est incrémenté et la minuterie est redémarrée.
Si le délai imparti est expiré sans que le bouton soit activé, alors doButton est exécuté. Notez qu'il sera nécessaire d'exécuter le script en tant que root, ce qui sera le cas de toute falçon lorsque le script sera démaré comme service.
Pour essayer cette version, récupérez le script complet et rendez-le exécutable. Vous souhaiterez peut-être conserver l'ancien script comme indiqué dans la première ligne ci-dessous. Le script, wdog_o.py, peut également être téléchargé.
Bien sûr, cette solution n'empêche pas le chien de garde de redémarrer le serveur lorsque ce dernier est arrêté avec une commande bash. Voici quelques solutions possibles:
- Utilisez encore une autre connexion E/S du serveur Pi au chien de garde Pi qui activée désactive le chien de garde.
- Utilisez un protocole de communication série, UART, SPI ou OneWire pour faire quelque chose de similaire. Ces approches nécessitent toutes une, deux ou même plusieurs connexions E/S.
- I2C n'était pas inclus car les Raspberry Pi sont uniquement des maîtres I2C et qu'avec ce protocoles des maîtres ne peuvent communiquer. Mais il peut être possible d'utiliser une EEPROM I2C comme boîte aux lettres où le serveur Pi laisse un avertissement dans une adresse mémoire spécifique indiquant qu'il s'arrête et le chien de garde Pi vérifie toujours le contenu de cette boîte aux lettres avant de redémarrer le serveur.
- Utilisez un signe de vie plus sophistiqué qui transmet deux types de messages: "Je suis vivant" et un signal "Je suis sur le point de fermer". Cela impliquera des scripts plus complexes, mais en principe, c'est tout à fait possible.
C'est amusant de spéculer sur ces solutions pour un problème somme tout mineure dans mon estimation. Avant de passer plus de temps à les examiner, il serait préférable de vérifier l'efficacité du chien de garde matériel.
Le chien de garde décrit ci-dessus a les capacités minimales qui seront requises de tous les autres appareils devant être évalués en tant que chiens de garde matériels. Cela se fera dans les prochains articles, comme annoncé dans l' introduction à cette série d'articles.
Chien de garde et aboyeur
Jusqu'à présent, le chien de garde a fait son travail très discrètement. Cela sera particulièrement vrai lorsque le chien de garde est exécuté en tant que service, car les messages des scripts wdog.py, destinés à faciliter les tests initiaux, ne seront pas visibles lorsque les scripts sont lancés par un service. Mais même le modeste Raspberry Pi Zero a des capacités de journalisation. J'ai donc converti les instructions d'impression en instructions de journalisation. Voici un exemple.
La fonction log ne fait qu'appeler la fonction syslog du module Python du même nom. Cette fonction imprime éventuellement le message destiné au journal sur la console fait dans le script précédent sauf pour l'ajout d'un horodatage. La fonction sendNotification fait appel à une fonction postmail pour envoyer un courrielchaque fois que le serveur Pi est sur le point d'être redémarré ou arrêté.
Bien sûr, vous aurez besoin du script pymail.py contenant la fonction postmail. Le module et un fichier de « secrets » pymail_secrets.py, sont dans une archive qui peut être obtenue ici: pymail_0-2-0.zip. Les valeurs dans le fichier des secrets et dans pymail.py devront être ajustées. Si le chien de garde n'a pas accès à Internet, basculez la macro SEND_NOTIFICATION à false.
Si une session SSH peut être ouverte sur le Raspberry Pi qui agit comme chien de garde, il sera alors possible de voir les messages de journalisation en temps réel.
Enfin, la fonction du bouton d'alimentation a été simplifiée. Un simple clic sur le bouton redémarrera à la fois le chien de garde et le serveur. Un appui long sur le bouton d'alimentation éteindra le chien de garde sans rien faire au serveur. Une fois que le chien de garde sera arrêté, il sera possible de le redémarrer en appuyant à nouveau sur le bouton car ce dernier est connecté à la broche E/S GPIO3. Je pense qu'il est beaucoup plus probable que je me souvienne de ces deux actions possibles au lieu des quatre.
Lorsque les deux appareils sont en arrêtés, il sera alors possible de les redémarrer sans couper puis rétablir l'alimentation. Appuyez sur le bouton d'alimentation du chien de garde pour redémarrer ce dernier, le serveur peut être redémarré en appuyant sur son bouton de réinitialisation.
Pour essayer cette dernière version des scripts de surveillance présentés dans cet article, téléchargez-le et rendez-le exécutable. Encore une fois, vous voudrez peut-être enregistrer toute version précédente avant de télécharger cette version du script.
Il faudra adapter quelques constantes au début du script.
Déchaîner le chien de garde
Tout ce qui doit être fait maintenant est de s'assurer que le script du chien de garde est exécuté automatiquement au démarrage du Raspberry Pi qui serveille le serveur. Cela se fait avec un fichier unité qui est presque identique à celui créé pour le signe de vie du serveur.
Comme précédemment, il est facile d'effectuer les tâches usuelles.
- Démarrez le service :
pi@wdog:~ $ sudo systemctl start piwdog.service
- Arrêter le service :
pi@wdog:~ $ sudo systemctl stop piwdog.service
- Vérifier l'état du service :
pi@wdog:~ $ sudo systemctl status piwdog.service
- Activer le lancement automatique du service au démarrage :
pi@wdog:~ $ sudo systemctl enable piwdog.service
- Désactiver le lancement automatique du service au démarrage :
pi@wdog:~ $ sudo systemctl disable piwdog.service
Horaire
How quickly should the hardware watchdog reboot the server when it no longer receives the heartbeat signal? It would be preferable that the home automation system be on line all the time to execute scheduled tasks as planned. That could lead one to decide on a fast response from the watchdog. However, provisions have been made in the circuit shown above for manual reboots of the server. Furthermore, I have rebooted the server from outside the house using one of the functions of the home automation system Domoticz more than once. When rebooting, the server will not be sending out heartbeat signals and it would be unfortunate if the starved watchdog were to reboot the server while it is in the process of booting. It would not be a catastrophe because when the watchdog itself reboots the server it knows to wait long enough for the server to reboot before trying to restart it. Actually, the watchdog does not know much of anything, the script contains no less than seven timing constants that will probably need to be adjusted in actual use.
The script is basically event driven. One event is when the repeat timer expires. The CHECK_INTERVAL is the time between timeouts. When that happens, the event handler checks how long it has been since the last time a heartbeat was received from the server Pi. If that time exceeds WATCHDOG_TIMEOUT, then the watchdog tries to reboot the server. That time period should be greater than the time the server needs to reboot as explained above. Right now the timeout is set at 45 seconds, but the test server, a Raspberry Pi 3 B, is just a skeleton. It is important to actually time a few reboots and set the timeout in accordance with the measured time plus a safety margin just in case adding another piece of software adds to the boot time. The constant SHUTDOWN_DELAY is related, because it should correspond to the time needed by the server Pi to shut down which should be in approximately half the time needed for a complete reboot. It is important not to underestimate this time because when that interval is over the watchdog will activate the server RUN signal. If that happens too soon, the effect would be to stop the whole shutdown process instead of restarting a machine. The RESET_DELAY may seem very short at 5 seconds, but this is not a very important value. After all, the watchdog is reset after initiating a reboot of the server and it will then wait however long it takes for the server to send a few initial heartbeats (as specified by the START_COUNT constant) before beginning to function.
If the pulse activating the server shutdown GPIO pin is too short, it will not work. No doubt because of the debounce delay in the gpio-shutdown module. A 3 tenths of a second pulse seems ok, but if the shutdowns initiated by the watchdog do not seem to work, it may be worthwhile to increase the value of PULSE_TIME. The BUTTON_BOUNCE constant is not too critical. It matters more in the previous version of the script when the number of consecutive button presses was being counted. In this version, all that needs to be distinguished is a short versus a long button press and the debounce delay could easily be 3 or 4 times greater without creating much difficulty.
Testing
Testing of the watchdog was done with two approaches. The simplest is to turn on both Raspberry Pi and, after the watchdog has started, to stop feeding it.
To help with the timing, the current time will be obtained just before halting the wdfeed service.
If the 51-seconds timeout seems excessive, remember that the watchdog checks the last time it was fed once every 10 seconds. Only if it has been more than 45 seconds since the last heartbeat was received will the watchdog initiate a reboot. So the time-out could be anywhere between 45 and 55 seconds. The SSH session opened with the server Pi was closed and the following message was received.
This confirmed that the watchdog performed as expected. I ran the test overnight by adding the following cron task.
The server stops feeding the watchdog every fifteen minutes triggering the watchdog whcih reboots the server Pi. This was verified by looking at the incoming emails the following morning. To be pedantic, the task only happens once, 15 minutes after the server Pi boots up, but then the cycle repeat. That verifies the mechanics of the watchdog. But to see it in action, it was necessary to "crash" the server Pi. In the past I have used the forkbomb.sh script.
It has the disadvantage of taking a relatively long while to use up all the resources. Others have come up with a similar script, let's call it crash.sh
So that is my arsenal for testing.
Do not forget to make the scripts executable, and remember that there is no point in enabling more than one of these tasks because the watchdog will reboot the server Pi when one of these tasks is first performed. (That's not exactly true, if crash.sh were started right after either of the other two, it would probably crash the Linux kernel before the previous task could be completed.
Démarrage à chaud et à froid du Raspberry Pi