logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 24-02-2013 19:13:50

trogloman
Membre
Distrib. : debian squeeze
Noyau : 3.2.0-0.bpo.3-amd64
(G)UI : KDE4
Inscription : 06-11-2012
Site Web

script bash monitoring serveur - pb retour à la ligne dans mail

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 ... roll
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




 

Hors ligne

#2 30-08-2013 01:29:35

david96
Invité

Re : script bash monitoring serveur - pb retour à la ligne dans mail

Sur ton serveur de production, que te donne :

echo -e "Yo\nYo"



Et merci pour ton script, je regarderai cela quand j'aurai un peu plus le temps wink

Dernière modification par Invité-2 (30-08-2013 01:29:49)

#3 01-09-2013 08:30:24

Dohri
Membre
Lieu : /home/dohri/canapé
Distrib. : Sid
Noyau : 3.10.1 amd64
Inscription : 19-12-2010
Site Web

Re : script bash monitoring serveur - pb retour à la ligne dans mail

Dans le genre il y a monit qui fait le boulot très bien sinon wink

Dernière modification par Dohri (01-09-2013 08:30:48)


Asus Zenbook ux32vd > Sid   |   eeepc 1215 > Sid + gnome  |   eeepc 1015 > Squeeze + gnome   |   sony vaio > Squeeze CLI   |   serveur home made > debian squeeze CLI

Hors ligne

#4 12-07-2016 17:50:19

tuxmika
Membre
Lieu : 35510 Cesson-Sevigné
Distrib. : Debian Jessie
Noyau : Linux 3.16.0-4-586
(G)UI : xfce
Inscription : 11-07-2016
Site Web

Re : script bash monitoring serveur - pb retour à la ligne dans mail

Slt trogloman

J'avais bricolé des script de surveillance de services à une époque

http://arobaseinformatique.eklablog.com … a106828940

http://arobaseinformatique.eklablog.com … a119114196

Si cela peut t'aider..

kenavo

Hors ligne

Pied de page des forums