Bonjour,
ça faisait un petit moment que je n'était pas repassé dans le coin ;-)
J'ai bricolé un petit script bash sur la base de différents truc trouvé a droite et a gauche sur le web + un peut de bidouille.
Il vérifie l'état d'apache et de mysql, tente de les relancer si il ne répondent pas, tout ça en envoyant des mais pour savoir ce qu'il en est.
ça fonctionne nickel, sauf que ...
Les caractères d'échappement de retour à la ligne pour la mise en forme du mail ne sont pas pris en compte sur ma machine de prod :-(
(ça marche très bien sur mon poste en local)
La machine en question est une kimsufi sous debian squeeze server (install ovh)
Si vous avez une idée du pourquoi du comment, et comment résoudre ce pb...
Je suis également preneur de toute remarque constructive sur le script, car je débute en bash... au point de passer des heures a rechercher comment concaténer une variable ou tester une valeur à true (le plaisir de redevenir débutant une fois de plus)
Et si ça peut servir a d'autres...
#!/bin/bash
# script pour controler le fonctionnement des services mysql et de apache
# => a ajouter en crontab.
#
# si l'un des deux est arrêté, un mail est envoyé à l'admin sys avec le status issu de la commande de relance
# au check suivant par cron, si le service ne répond pas, un nouveau mail est envoyé
#
#
# Après intervention manuelle, le status dois alors être réinitialisé avec le parametre "reset"
# Il est possible de tester le mail de sortie en lançant le script avec le parametre "affichage"
#
# /!\ PENSER A VIRER LE CRON SI ARRET DE APACHE OU MYSQL POUR MAINTENANCE, sinon ils seront relancés par le script
#
# /i\ pour l'envoi des mails, necessite l'installation des paquet:sendemail
# apt-get install sendemail
#
# Créé le 23/02/2012 par daha@waloomaloo.com
#
###############################################################################################
# configuration #
###############################################################################################
################ paramètres utilisateur/machine ##########################################################
### information contenues dans le mail
SERVER="adresse.serveur.com/"
EMAIL_TO="email@domaine.com"
EMAIL_FROM="email@domaine.com"
### fichier log
LOGFILE='/var/log/monitoring_services-actif.log'
# log apache et mysql pour envoi si plantage au deuxième passage
APACHE_LOG='/var/log/apache2/acces.log'
APACHE_ERROR_LOG='/var/log/apache2/error.log'
MYSQL_LOG='/var/log/mysql.log'
MYSQL_ERROR_LOG='/var/log/mysql.err'
### repertoire de travail
WORKDIR="/tmp"
################Elements surveillés ##########################################################
### HTTP
HTTPSERVERIP="127.0.0.1"
HTTPSERVERPORT="80"
### MYSQL
# mysql root/admin username
MYSQL_LOGIN="root"
# mysql admin/root password
MYSQL_PASSWORD="motdepasse"
# mysql server hostname
MYSQL_HOST="localhost"
################ paramètres systeme ##########################################################
### commande shell (selon systeme)
#démarrage apache"
APACHE_START="/etc/init.d/apache2 start"
# démarrage de mysql
MYSQL_START="/etc/init.d/mysql start"
# mysql bash admin
MYSQL_ADMIN="/usr/bin/mysqladmin"
################ Initialisation autres éléments ##############################################
### initialisation des paramètres d'envoi d'email
EMAIL_SEND=false
EMAIL_MAIN=""
EMAIL_FLAG=""
###############################################################################################
###############################################################################################
# Début des hostilités #
###############################################################################################
###############################################################################################
###Change dir###
cd $WORKDIR
###############################################################################################
# réinitialisation du status via param reset #
###############################################################################################
# suppression des fichiers marqueurs lorsque le paramètre "reset" est transmis à la commande
if [ $1 ]; then
if [ "$1" = "reset" ]; then
echo "APACHE - [notice] - `date` - Erreur serveur fixée par utilisateur">>${LOGFILE}
echo "réinitialisation du monitoring de services actifs par l'utilisateur"
rm server_problem*.txt
rm bdd_problem*.txt
exit 1;
fi
fi
###############################################################################################
# Vérification si pb déjà signalé #
###############################################################################################
# Quitte le script si l'email à déjà été envoyé
if [ -f server_probleme.txt ]; then
# ajouter vérification du délai de signalement, pour renvoyer si plus de x min ?
exit 1;
fi
###############################################################################################
###############################################################################################
# Vérification activité apache #
###############################################################################################
###############################################################################################
###Test HTTP
# 1) on détecte un pb, on va tenter une deuxième fois
# 2) - Si toujours le même pb, on relance apache et on enregistre la sortie et la balance par mail, on ajoute le marqueur de deuxième niveau
# - Si plus de pb, on supprime le fichier marqueur, on envoi un mail
# 3 ) - Si toujours le pb, on relance a nouveau, on envoi un mail [alerte][urgent]
EMAIL_MAIN="${EMAIL_MAIN}\n\n=>CHECK APACHE==============================================================================================\n"
(
echo "quit"
) | telnet $HTTPSERVERIP $HTTPSERVERPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then # apache répond Ok =======================================================================> service UP
#echo "PORT $HTTPSERVERPORT CONNECTED"
if [ -f server_problem*.txt ]; then # on supprime le fichier marqueur et on log
rm -rf server_problem*.txt
echo "APACHE - [notice] - `date` - Le serveur est a nouveau fonctionnel">>${LOGFILE}
#preparations de l'envoi d'email
EMAIL_SEND=true
EMAIL_FLAG="${EMAIL_FLAG}[Apache2][notice]"
EMAIL_MAIN="${EMAIL_MAIN}\n`date` - Le serveur est a nouveau fonctionnel"
fi
else #Connection failure ==========================================================================================>service DOWN
if [ -f server_probleme_first.txt ]; then #deuxieme passage, on prépare la notification a envoyer ===================> 2° passage down
cat server_probleme_first.txt>>server_probleme.txt
echo "APACHE - [alerte] [urgent]- `date` - Le redemarrage semble avoir echoue - intervention necessaire !!">>${LOGFILE}
rm -rf server_probleme_first.txt
#preparations de l'envoi d'email
EMAIL_SEND=true
EMAIL_FLAG="${EMAIL_FLAG}[Apache2][alerte][urgent]"
EMAIL_MAIN="${EMAIL_MAIN}\n`date` - Le redemarrage semble avoir echoue - intervention necessaire !!"
EMAIL_MAIN="${EMAIL_MAIN}\n$(cat server_probleme.txt)"
#on ajoute les dernières lignes du log d'erreur,
EMAIL_MAIN="${EMAIL_MAIN}\n\n========================================================================================================="
EMAIL_MAIN="${EMAIL_MAIN}\n dernieres entrées log de ${APACHE_ERROR_LOG} :"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(tail -10 ${APACHE_ERROR_LOG})"
EMAIL_MAIN="${EMAIL_MAIN}\n\n========================================================================================================="
EMAIL_MAIN="${EMAIL_MAIN}\n dernieres entrées log de ${APACHE_LOG} :"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(tail -10 ${APACHE_LOG})"
else #First notification ==================> 1° passage down
echo "APACHE - [notice] - `date` - Le serveur ne répond pas, nouvel essai dans 5 secondes...">>${LOGFILE} #(attente de 5 seconde avant de re-tester)
EMAIL_MAIN="${EMAIL_MAIN}\n`date` - Le serveur ne répond pas, nouvel essai dans 5 secondes..."
sleep 5
(
echo "quit"
) | telnet $HTTPSERVERIP $HTTPSERVERPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then # apache répond Ok ===================> 1° pass: finalement up
#echo "PORT $HTTPSERVERPORT CONNECTED"
if [ -f server_problem*.txt ]; then # on supprime le fichier marqueur et on log
rm -rf server_problem*.txt
echo "APACHE - [notice] - `date` - Le serveur est a nouveau fonctionnel">>${LOGFILE}
fi
else #Connection failure ====================> 1° pass: toujours down, on relance
echo "APACHE - [warning] - `date` - Le serveur ne répond toujours pas, on tente de le relancer.">>${LOGFILE}
EMAIL_SEND=true
EMAIL_FLAG="${EMAIL_FLAG}[Apache2][warning]"
EMAIL_MAIN="${EMAIL_MAIN}\n`date` - Le serveur ne répond toujours pas, on tente de le relancer."
#echo `/etc/init.d/apache2 start` >> server_probleme_first.txt
$APACHE_START >> server_probleme_first.txt
#echo `/etc/init.d/apache2 status` >> server_probleme_first.txt
EMAIL_MAIN="${EMAIL_MAIN}\n$(cat server_probleme_first.txt)"
EMAIL_MAIN="${EMAIL_MAIN}\n\n========================================================================================================="
EMAIL_MAIN="${EMAIL_MAIN}\n dernieres entrées log de ${APACHE_ERROR_LOG} :"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(tail -10 ${APACHE_ERROR_LOG})"
echo `cat server_probleme_first.txt`>>${LOGFILE}
fi
fi
fi
###############################################################################################
###############################################################################################
# Vérification Serveur MYSQL #
###############################################################################################
###############################################################################################
# on teste si le serveur est fonctionnel
EMAIL_MAIN="${EMAIL_MAIN}\n\n=>CHECK MYSQL==============================================================================================\n"
$MYSQL_ADMIN -h $MYSQL_HOST -u $MYSQL_LOGIN -p${MYSQL_PASSWORD} ping 2>/dev/null 1>/dev/null
if [ $? -ne 0 ]; then # ==========================================================================================>service DOWN
if [ -f bdd_probleme_first.txt ]; then #deuxieme passage, on prépare la notification a envoyer ===================> 2° passage down
cat bdd_probleme_first.txt>>bdd_probleme.txt
echo "MYSQL - [alerte] [urgent]- `date` - Le redemarrage semble avoir echoue - intervention necessaire !!">>${LOGFILE}
rm -rf bdd_probleme_first.txt
#preparations de l'envoi d'email
EMAIL_SEND=true
EMAIL_FLAG="${EMAIL_FLAG}[MySQL][alerte][urgent]"
EMAIL_MAIN="${EMAIL_MAIN}\n`date` - Le redemarrage semble avoir echoue - intervention necessaire !!"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(cat bdd_probleme.txt)"
#on ajoute les dernières lignes du log d'erreur,
EMAIL_MAIN="${EMAIL_MAIN}\n\n========================================================================================================="
EMAIL_MAIN="${EMAIL_MAIN}\n dernieres entrées log de ${MYSQL_ERROR_LOG} :"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(tail -10 ${MYSQL_ERROR_LOG})"
EMAIL_MAIN="${EMAIL_MAIN}\n\n========================================================================================================="
EMAIL_MAIN="${EMAIL_MAIN}\n dernieres entrées log de ${MYSQL_LOG} :"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(tail -10 ${MYSQL_LOG})"
else # ==================> 1° passage down
echo "MYSQL - [notice] - `date` - Le serveur MySQL ne répond pas au ping, nouvel essai dans 5 secondes...">>${LOGFILE} #(attente de 5 seconde avant de re-tester)
EMAIL_MAIN="${EMAIL_MAIN}\n`date` - Le serveur MySQL ne répond pas au ping, nouvel essai dans 5 secondes..."
EMAIL_MAIN="${EMAIL_MAIN}\nHostname: $(hostname)"
sleep 5
$MYSQL_ADMIN -h $MYSQL_HOST -u $MYSQL_LOGIN -p${MYSQL_PASSWORD} ping 2>/dev/null 1>/dev/null
if [ $? -ne 0 ]; then # echec du ping ====================> 1° pass: toujours down, on relance
echo "MYSQL - [warning] - `date` - Le serveur MySQL ne répond toujours pas, on tente de le relancer.">>${LOGFILE}
EMAIL_SEND=true
EMAIL_FLAG="${EMAIL_FLAG}[MySQL][warning]"
EMAIL_MAIN="${EMAIL_MAIN}\n`date` - Le serveur MySQL ne répond toujours pas, on tente de le relancer."
# on redémarre le serveur MySQL
$MYSQL_START>>bdd_probleme_first.txt
# On regarde si MySQL a redémarré ou non
o=$(ps cax | grep -c ' mysqld$')
if [ $o -eq 1 ]; then # ====================> Serveur relancé avec succès
echo "MYSQL - [notice] - `date` - Le serveur MySQL a redémarré avec succès !">>${LOGFILE}
EMAIL_SEND=true
EMAIL_FLAG="${EMAIL_FLAG}[MySQL][notice]"
EMAIL_MAIN="${EMAIL_MAIN}\nLe serveur MySQL a redémarré avec succès !"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(cat bdd_probleme_first.txt)"
EMAIL_MAIN="${EMAIL_MAIN}\n\n plus rien a faire ;-) a part éventuellement jetter un oeil dans les log :-/"
EMAIL_MAIN="${EMAIL_MAIN}\n\n========================================================================================================="
EMAIL_MAIN="${EMAIL_MAIN}\n dernieres entrées log de ${MYSQL_ERROR_LOG} :"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(tail -10 ${MYSQL_ERROR_LOG})"
echo `cat bdd_probleme_first.txt`>>${LOGFILE}
rm -rf bdd_probleme_first.txt
else # ====================> le redemarrage du serveur a planté ou long ?
EMAIL_SEND=true
EMAIL_FLAG="${EMAIL_FLAG}[MySQL][warning]"
EMAIL_MAIN="${EMAIL_MAIN}\n$(cat bdd_probleme_first.txt)"
EMAIL_MAIN="${EMAIL_MAIN}\nMySQL ne semble pas avoir redemarré correctement... ou prend son temps ?"
EMAIL_MAIN="${EMAIL_MAIN}\n\n========================================================================================================="
EMAIL_MAIN="${EMAIL_MAIN}\n dernieres entrées log de ${MYSQL_ERROR_LOG} :"
EMAIL_MAIN="${EMAIL_MAIN}\n\n$(tail -10 ${MYSQL_ERROR_LOG})"
echo `cat bdd_probleme_first.txt`>>${LOGFILE}
fi
else # ===================> 1° pass: finalement up
if [ -f bdd_problem*.txt ]; then # on supprime le fichier marqueur et on log
rm -rf bdd_problem*.txt
echo "APACHE - [notice] - `date` - Le serveur est a nouveau fonctionnel">>${LOGFILE}
fi
fi
fi
else # MySQL est fonctionnel =================================================================================> service UP
if [ -f bdd_problem*.txt ]; then # on supprime le fichier marqueur et on log
rm -rf bdd_problem*.txt
echo "MYSQL - [notice] - `date` - Le serveur MySQL est a nouveau fonctionnel">>${LOGFILE}
#preparations de l'envoi d'email
EMAIL_SEND=true
EMAIL_FLAG="${EMAIL_FLAG}[MySQL][notice]"
EMAIL_MAIN="${EMAIL_MAIN}\n`date` - Le serveur MySQL est a nouveau fonctionnel"
fi
fi
###############################################################################################
###############################################################################################
# Envoi de l'email de notification #
###############################################################################################
###############################################################################################
# en fonction de la valeur de EMAIL_SEND,
if ${EMAIL_SEND}; then
EMAIL_HEADER=""
EMAIL_HEADER="${EMAIL_HEADER}\n ${EMAIL_FLAG} "
EMAIL_HEADER="${EMAIL_HEADER}\n ${SERVER}"
EMAIL_HEADER="${EMAIL_HEADER}\n `date` monitoring de service (apache mysql ...)"
EMAIL_HEADER="${EMAIL_HEADER}\n\n -> Email généra par le script: $(basename $0)"
EMAIL_HEADER="${EMAIL_HEADER}\n====================================================================================================================================== \n\n "
# affichage du mail si paramètre "affichage" transmis
if [ $1 ]; then
if [ "$1" = "affichage" ]; then
echo ""
echo ""
echo ""
echo "=========================================mail bof============================================================================="
echo ""
echo "${EMAIL_HEADER}${EMAIL_MAIN}"
echo ""
echo "=========================================mail eof============================================================================"
echo ""
echo ""
echo ""
fi
fi
echo "${EMAIL_HEADER}${EMAIL_MAIN}" |
perl -e '($_ = join "",<>) =~ s/(\t)/ /g; print;' |
sendEmail -f "${EMAIL_FROM}" -u "[monitoring] ${EMAIL_FLAG} Services Actifs- ${SERVER}" -t ${EMAIL_TO}
fi