Cet article m’a été inspiré par une question de JeanPap à qui je dédicace donc cette page qui sera la dernière de l’année 2020 🙂
En quelques mots, voici le décor : nous avons un Raspberry Pi ou un PC sous Linux qui fait tourner des services comme un serveur FTP ou une instance de Domoticz ou Apache2 ou Nginx ou …
Parfois, ce service plante et, en l’absence d’outil de supervision … ben … Pfff … On ne le sait pas (oui, c’est de la mise en contexte un peu Hitchockienne ; ça fait trembler).
L’idée est de partir du concept que nous utilisons tous souvent (moi, oui) ; le fameux sudo service machin status
permettant de surveiller si un service est actif.
Ainsi, on a fait sudo service apache2 restart
dans l’article Installation de NextCloud sur Debian 10.7 de la semaine dernière (quoi, tu ne l’as pas lu ; bouh ; pas bien).
Bref, sudo service machin start/restart/stop/restart/reload
est une commande assez connue … si, si, … quand on s’en sert 😉
L’origine de cet article est donc une question de JeanPap. En résumant, son Domoticz plante et il faut pouvoir le relancer même si on ne le sait pas.
Pour l’aider à trouver une solution, j’ai testé un truc tout bête sur mon vieux RpiB+ donné il y a quelques années par Karen R et qui me sert actuellement de back-up FTP pour ce site Web et les sites de 3 amies (oui, je suis sympa).
Je peux vérifier que le service FTP tourne en faisant :sudo service proftpd status
Mon Raspberry Pi me répond gentiment
(…) Active: active (running) since
(…)
Du coup, on va s’en servir pour aider JeanPap.
Je vais créer un script de surveillance en tapant :nano script-surveillance-status.sh
Il contient :
#!/bin/bash
SERVICE=proftpd
if (( $(ps -ef | grep -v grep | grep $SERVICE | wc -l) > 0 ))
then
echo "oui, oui, $SERVICE est actif ; tout va bien :-)"
else
echo "Flute, $SERVICE est planté ; bon, pas grave, on redémarre"
sudo service $SERVICE start
echo "C'est bon, je te l'ai redémarré ton $SERVICE !"
echo | mutt -s "$SERVICE a été redémarré" mon-adresse@machin.truc
fi
Explications :
ps : commande servant à lister les processus et leurs propriétés.
On y ajoute des options ; essayez ps -ef
grep : est un outil de recherche ; ça permet de se concentrer sur la chose recherchée.
Essayez ps -ef | grep proftpd
wc -l : afficher le nombre de lignes.
Essayez ps -ef | grep proftpd | wc -l
En ajoutant le pipe | grep -v grep |
on limite encore les résultats (on vire la ligne contenant grep puisque le processus est actif donc affiché par défaut) :
pi@raspberrypi:~$ ps -ef | grep proftpd
proftpd 7745 1 0 11:24 ? 00:00:00 proftpd: (accepting connections)
pi 8355 6413 0 11:25 pts/1 00:00:00 grep --color=auto proftpd
devient
pi@raspberrypi:~$ ps -ef | grep -v grep | grep proftpd
proftpd 7745 1 0 11:24 ? 00:00:00 proftpd: (accepting connections)
devient
pi@raspberrypi:~ $ ps -ef | grep -v grep | grep proftpd | wc -l
1
Évidemment, si on stoppe le service avec sudo service proftpd stop
la commande ne donne pas le même résultat :
pi@raspberrypi:~ $ ps -ef | grep -v grep | grep proftpd | wc -l
0
Bref, vous avez compris ? Si le nombre de ligne est à 1 = service actif ; si le nombre de ligne est à 0 = service inactif.
Donc, en gros, la ligne « if (( $(ps -ef | grep -v grep | grep $SERVICE | wc -l) > 0 ))
» signifie que si on liste les services mais qu’on se concentre juste sur proftpd et qu’on liste le nombre de ligne. S’en suit un alors (then
) et un sinon (else
).
C’est le principe des scripts : si machin, alors truc, sinon bidule.
Pour commencer, je stoppe le processus avec :sudo
service proftpd stop
Et si je fais :sudo service proftpd status
Mon service est bien Active: inactive (dead)
Mais si je lance mon script avec :bash script-surveillance-status.sh
Alors mon prochain sudo service proftpd status
me renvoie un service actif
Bref, le script fonctionne ; il permet de ne rien faire si le service est actif et de relancer le service s’il est inactif. Ici, j’ai fait avec proftpd mais vous pouvez remplacer proftpd par domoticz, ou apache2 ou nginx ou …
Ça donne donc :
- Si proftpd est actif :
pi@raspberrypi:~ $ bash script-surveillance-status.sh
oui, oui, proftpd est actif ; tout va bien :-)
- Mais si proftpd est stoppé :
pi@raspberrypi:~ $ bash script-surveillance-status.sh
Flute, proftpd est planté ; bon, pas grave, on redémarre
C'est bon, je te l'ai redémarré ton proftpd !
Ensuite, on peut éditer crontab (crontab -e) afin de créer une tache pour exécuter ce (superbe) script toutes les x minutes.
Dans le cas de mes tests, vous avez remarquez que j’ai mis des echo afin d’avoir un retour écran :echo "oui, oui, $SERVICE est actif ; tout va bien :-)"
echo "Flute, $SERVICE est planté ; bon, pas grave, on redémarre"
echo "C'est bon, je te l'ai redémarré ton $SERVICE !"
Mais, c’est vrai que c’est un peu inutile en cas de tache cron et de Raspberry Pi ou machine Debian sans écran 😀
D’où l’ajout de l’envoi d’un courriel avec :echo | mutt -s "$SERVICE a été redémarré" mon-adresse@machin.truc
Car je reçois un courriel vide dont l’objet est « proftpd a été redémarré » ; courriel que je ne reçois que si le script a dû réactiver proftpd.
(Je parle de mutt dans cet ancien article de sonnette connectée)
Elle n’est pas belle la vie ?
Bon, et bien … après avoir lu et relu votre dernier article de l’année … ça coinçait encore un peu … j’ai juste fait une petite modif à la fin de la ligne :
» if (( $(ps -ef | grep -v grep | grep $domoticz | wc -l) <1 )) " et ça marche … impec ! … grand merci … sans vous j'aurais été "coincé" … mon RPI équipé du service Domoticz me permet de gérer pas mal de choses dans ma maison et à distance avec mon smartphone (c'est beau le progrès) … seulement … Domoticz dernière version "bug" régulièrement. Je me rend compte que j'utilise un système peu couteux mais sophistiqué … qui fonctionne … mais auquel je ne comprends pas grand chose … 🙂 … si Monsieur Alban me lâche … je suis foutu ! … bon … faut bien rire un peu … maintenant je vais savoir à quel moment mon Domoticz est "stopped" même si je suis à Trifouilli-les-Alouettes … quel soulagement … encore merci, bonne année à tous …et A+ … JeanPap … 🙂