Surveiller un service et le relancer automatiquement

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 ?

 

A propos de Alban

Papa de 4 enfants étant lui-même resté un enfant. Diététicien-Nutritionniste tombé par obligation dans l'informatique à 22 ans pour le boulot et s'étant "un peu" pris au jeu ... Pas un génie de l'informatique (loin de là), mais intéressé et carrément orienté Linux et entraide. Lassé de l'évolution du Monde de la Santé dans lequel les patients sont de plus en plus à traiter comme des clients (je suis un soignant !!!), j'ai opté pour une reconversion en repartant en Alternance dans le cadre d'un BTS SIO option SISR (Solutions d’Infrastructure, Systèmes et Réseaux) en Septembre 2019.

Une réponse à “Surveiller un service et le relancer automatiquement”

  1. 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 … 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.