Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Techniques informatiques

Monitorer un serveur Linux (script)

Créé le 29/07/2023 / Modifié le 05/08/2023

Si vous souhaitez être alerté lors de problème d'espace disque, de RAM et de charge processeur, voici un script que j'ai réalisé pour proposer une solution rapide à mettre en place.

L'alerte prend la forme d'un email contenant le détail de ce qu'il se passe sur le serveur, aux niveaux des processus, de la mémoire et de l'espace disque. Il est envoyé lorsqu'un des seuils critiques est atteint.

Voici la procédure de mise en place :

  • Créez un fichier sur votre serveur (nommé monitorer_serveur.sh par exemple), avec un utilitaire comme nano
  • Copiez-collez le code ci-dessous :
    #!/bin/bash

    # Constantes
    DESTI_EMAIL="email@domaine.com"
    LOG_FICHIER="/var/log/system_monitor.log"
    LOG_NB_ENTREES_MAXI=10
    EMAIL_SUJET="[$(hostname)] Rapport de surveillance système"
    SEUIL_CPU=80
    SEUIL_MEMOIRE=90
    SEUIL_ESPACE_DISQUE=90

    # Variables pour les seuils dépassés
    alerte_cpu=false
    alerte_memoire=false
    alerte_espace_disque=false

    # Variable pour stocker les informations des seuils dépassés
    message_alerte=""

    # Envoie un e-mail
    envoieEmail() {
        local sujet="$1"
        local message="$2"
        local logs=$(tail -n "$LOG_NB_ENTREES_MAXI" "$LOG_FICHIER")
        #local top_processes="$(ps -eLo user,%cpu,cmd | awk 'NR == 1; NR > 1 {print | "sort -k2,2nr | head -n 10"}')"
        #local top_processes="$(ps -eo user,%cpu,cmd --sort=-%cpu | head -n 11)"
        local top_processes="$(top -b -n 1 -o %CPU | head -n 15)"
        local info_load_average="$(uptime)"
        local info_memoire="$(free -h)"
        local info_disque="$(df -h)"

        local date=$(date '+%Y-%m-%d %H:%M:%S')
        echo -e "$message\nDate de l'alerte : $date\n\nDernières mesures :\n$logs\n\nProcessus qui consomment le plus :\n$top_processes\n\nLoad average :\n$info_load_average\n\nInfos mémoire :\n$info_memoire\n\nOccupation disque :\n$info_disque" | mail -s "$sujet" "$DESTI_EMAIL"
    }

    # Affiche le texte coloré
    coloreTexte() {
        local code_couleur=$1
        local texte=$2
        echo -e "${code_couleur}${texte}\e[0m"
    }

    get_taux_util_cpu() {
        local stat1=$(grep '^cpu ' /proc/stat)
        sleep 5
        local stat2=$(grep '^cpu ' /proc/stat)

        awk -v s1="$stat1" -v s2="$stat2" 'BEGIN {
            split(s1, a1); split(s2, a2);
            tot1 = a1[2]+a1[3]+a1[4]+a1[5]+a1[6]+a1[7]+a1[8];
            tot2 = a2[2]+a2[3]+a2[4]+a2[5]+a2[6]+a2[7]+a2[8];
            idle1 = a1[5] + a1[6];
            idle2 = a2[5] + a2[6];

            diff_tot = tot2 - tot1;
            diff_idle = idle2 - idle1;

            if (diff_tot > 0) {
                usage = (1 - (diff_idle / diff_tot)) * 100;
                # Arrondi à entier le plus proche
                print int(usage + 0.5);
            } else {
                print 0;
            }
        }'

    }

    # -- Convertir l'utilisation du CPU en pourcentage entre 0 et 100
    #utilisation_cpu=$(awk "BEGIN { pourcentage = $utilisation_cpu * 100; print pourcentage }")
    utilisation_cpu="$(get_taux_util_cpu)"

    date=$(date '+%Y-%m-%d %H:%M:%S')

    # Surveillance de la mémoire RAM
    utilisation_memoire=$(free | awk '/Mem/{printf("%.2f"), $3/$2 * 100}')

    # Surveillance de l'utilisation de l'espace disque
    utilisation_disque=$(df -h | awk '/\/$/{printf("%s"), $5}' | cut -d '%' -f1)

    # Enregistrement des mesures dans le fichier de logs
    log_message="$date - Processeur : $utilisation_cpu%, Mémoire : $utilisation_memoire%, Espace disque : $utilisation_disque%"
    echo "$log_message" >> "$LOG_FICHIER"

    # Vérification de la charge du processeur
    if (( utilisation_cpu >= SEUIL_CPU )); then
        alerte_cpu=true
        message_alerte+="La charge processeur actuelle est élevée : $utilisation_cpu %\n"
    fi

    # Vérification de l'utilisation de la mémoire
    if (( $(echo "$utilisation_memoire >= $SEUIL_MEMOIRE" | bc -l) )); then
        alerte_memoire=true
        message_alerte+="L'utilisation de la mémoire RAM est élevée : $utilisation_memoire %\n"
    fi

    # Vérification de l'utilisation de l'espace disque
    if ((utilisation_disque >= SEUIL_ESPACE_DISQUE)); then
        alerte_espace_disque=true
        message_alerte+="L'utilisation de l'espace disque est élevée : $utilisation_disque %\n"
    fi

    # Vérifier s'il y a des seuils dépassés et envoyer un e-mail si nécessaire
    if $alerte_cpu || $alerte_memoire || $alerte_espace_disque; then
        envoieEmail "[$(hostname)] Alertes système" "$message_alerte"
    fi

    # Affichage du statut global dans la console
    message="Charge processeur : $utilisation_cpu%, Mémoire : $utilisation_memoire%, Espace disque : $utilisation_disque% ==> "
    message+=$([ "$alerte_cpu" = true ] || [ "$alerte_memoire" = true ] || [ "$alerte_espace_disque" = true ] && coloreTexte "\e[31m" "Alerte envoyée" || coloreTexte "\e[32m" "OK")
    echo "$message"
  • Modifiez l'adresse email de destination (variable DESTI_EMAIL) et éventuellement les seuils d'alerte
  • Enregistrez le fichier
  • Affichez le gestionnaire CRON :
    crontab -e
  • Ajoutez la ligne suivante, enregistrez et quittez
    */5 * * * * bash /opt/scripts/monitorer_serveur.sh

Le script sera ainsi lancé toutes les 5 minutes et enverra un message par email en cas de problème.

Quillevere.net

Commentaires

Aucune inscription n'est requise si vous souhaitez
oct. 21
2026

Ah oui, désolé pour les caractères manquants, c'était dû à mon système de formatage. C'est corrigé. Pour l'envoi systématique d'email, je ne vois pas pourquoi ça se se produirait puisqu'il est conditionné selon les 3 valeurs paramétrées. A moins justement de dépasser l'une d'entre elles.

Eric
oct. 19
2026

Merci pour ce script !! Il faut toutefois rajouter des ']' manquants ligne 88 pour fermer les évaluations. Par ailleurs chez moi, le script en l'état crée l'envoi d'un mail à chaque exécution, à cause de la dernière ligne. Je l'ai commentée, mais on peut probablement plutôt tester l'environnement pour déterminer si l'exécution est réalisée par le cron ou dans un terminal.

leon

Rechercher sur le site

fr en rss RSS info Informations