[Asterisk] Superviser son service
10/06/2018
Un service Asterisk qui tombe, ça peut arriver. C'est la panne et il faut le relancer.
Nous proposons un script shell qui s'occupe de vérifier à intervalle régulier l'état du service Asterisk. Si le service est DOWN, celui-ci est relancé et un e-mail d'alerte est envoyé.
Une première solution peut consister à s'assurer que le service soit bien lancé. Cela s'opère depuis la commande suivante :
Si le service Asterisk tourne, il nous est retourné quelque chose comme :
De notre expérience, cette vérification ne suffit pas : nous avons déjà rencontré des services Asterisk qui était lancé (service UP), mais qui était en défaut de fonctionnement (impossible de connecter à la console, impossible d'enregistrer un peer, etc.).
Pour cette raison, nous préférons utiliser la commande suivante qui a pour intérêt de se connecter à la console Asterisk :
Si le service Asterisk est démarré et pleinement fonctionnel, le message suivant est retourné :
Si le service est arrêté ou qu'il ne répond plus, nous recevrons le message suivant :
On crée un script shell qui vérifie si le service Asterisk est OK ou KO :
Ce script pose néanmoins deux problèmes :
On améliore donc tout ça...
On ajoute la possibilité que le message retourné puisse être autre chose que ceux prévus. On alerte par e-mail :
On automatise l'exécution de ce script
On édite le fichier /etc/crontab pour y ajouter les lignes suivantes :
Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous
Nous proposons un script shell qui s'occupe de vérifier à intervalle régulier l'état du service Asterisk. Si le service est DOWN, celui-ci est relancé et un e-mail d'alerte est envoyé.
Vérifier l'état du service
Une première solution peut consister à s'assurer que le service soit bien lancé. Cela s'opère depuis la commande suivante :
myserver# ps ax | grep 'asterisk
Si le service Asterisk tourne, il nous est retourné quelque chose comme :
12039 ? Ssl 7:13 /usr/sbin/asterisk
De notre expérience, cette vérification ne suffit pas : nous avons déjà rencontré des services Asterisk qui était lancé (service UP), mais qui était en défaut de fonctionnement (impossible de connecter à la console, impossible d'enregistrer un peer, etc.).
Pour cette raison, nous préférons utiliser la commande suivante qui a pour intérêt de se connecter à la console Asterisk :
asterisk -rx 'test'
Si le service Asterisk est démarré et pleinement fonctionnel, le message suivant est retourné :
No such command 'test' (type 'core show help test' for other possible commands)
Si le service est arrêté ou qu'il ne répond plus, nous recevrons le message suivant :
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)
On script !
On crée un script shell qui vérifie si le service Asterisk est OK ou KO :
#!/bin/bash # # Commande Asterisk testAsterisk=$(asterisk -rx 'test') # On compte le nombre de caractères retournés nombre=${#testAsterisk} case $nombre in 81) #Asterisk OUT, on le redémarre /etc/init.d/asterisk restart ;; 79) #Asterisk est OK ;; esac
Ce script pose néanmoins deux problèmes :
- Que se passe-t-il si Asterisk retourne autre chose que l'un des deux messages prévus ?
- Il peut être intéressant d'être prévenu par e-mail !
On améliore donc tout ça...
Script final
On ajoute la possibilité que le message retourné puisse être autre chose que ceux prévus. On alerte par e-mail :
#!/bin/bash # # Fonctionnement : # Vérification de l'état du service Asterisk - toutes les minutes (job cron) # 1) Asterisk est KO : on redémarre et on envoie un e-mail au support # 2) Asterisk est OK : on ne fait rien... # 3) On ne sait pas : on envoie un e-mail au support # Commande Asterisk testAsterisk=$(asterisk -rx 'test') # On compte le nombre de caractères retournés nombre=${#testAsterisk} case $nombre in 81) #Asterisk OUT, on le redémarre /etc/init.d/asterisk restart SUBJECT="[URGENT] Serveur Asterisk KO" EMAIL="support@example.com, john.doe@example.com, paul.smith@example.com" EMAILMESSAGE="/tmp/emailmessage.txt" echo "Le service Asterisk est KO" > $EMAILMESSAGE echo "Il vient d'être redémarré automatiquement..." >> $EMAILMESSAGE echo "Merci de vérifier !" >> $EMAILMESSAGE echo "Bonne journée" >> $EMAILMESSAGE echo "--" >> $EMAILMESSAGE echo "La commande asterisk -rx 'test' a renvoyée le message suivant :" >> $EMAILMESSAGE echo $testAsterisk >> $EMAILMESSAGE mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE ;; 79) #Asterisk est OK ;; *) #Retour inattendu SUBJECT="Serveur Asterisk -> État inconnu" EMAIL="support@example.com" EMAILMESSAGE="/tmp/emailmessage.txt" echo "L'état du service Asterisk n'est pas connu." > $EMAILMESSAGE echo "La commande asterisk -rx 'test' a renvoyée le message suivant :" >> $EMAILMESSAGE echo $testAsterisk >> $EMAILMESSAGE echo "Bonne journée" >> $EMAILMESSAGE mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE ;; esac
On automatise l'exécution de ce script
On édite le fichier /etc/crontab pour y ajouter les lignes suivantes :
# Verifie que le service Asterisk soit bien OK - toutes les minutes * * * * * root /home/supervision/verifAsteriskStart.sh > /dev/null 2> /dev/null
Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous
Retrouvez nos services et firewall pour pfSense & OPNsense
3 commentaires
stephane Thomas - 17/09/2014 à 18:27:53
Merci très beaucoup pour cet exposé. Continuez.
super boulot! rien à dire
Mireille - 17/09/2014 à 18:28:33
On en veut davantage traité de cette manière. Sympa.
excellent travail
Monel - 08/06/2015 à 15:53:45
Peu au fait du sujet, je vérifie assez peu mes services donc merci pour ce script très ingénieux.
Flux RSS des commentaires de cet article