Recherche de site Web

Script Bash pour surveiller la santé de Linux quotidiennement avec Cron


Gérer des serveurs Linux au quotidien peut être amusant et stressant, surtout lorsque vous êtes confronté à des interruptions inattendues ou à des pannes de service. Une chose que j'ai apprise en plus de 15 ans en tant qu'administrateur système Linux est la suivante : prévenir vaut mieux que guérir.

Vous ne voulez pas attendre que les utilisateurs signalent des problèmes. En tant qu'administrateur système, votre objectif devrait être de détecter les problèmes avant qu'ils n'affectent les utilisateurs ou les charges de travail en production.

C’est pourquoi je recommande toujours d’automatiser les vérifications quotidiennes de la santé de votre système. Si vous savez à l’avance que l’espace disque est faible ou qu’un service a échoué, vous pouvez le réparer avant que les utilisateurs ne commencent à crier.

Dans ce tutoriel, je vais vous montrer comment :

  • Créez un script Bash simple mais puissant pour vérifier la santé critique du système.
  • Configurez-le pour qu'il s'exécute quotidiennement avec Cron.
  • Recevoir le rapport par email (optionnel).

Ce script fonctionne parfaitement sur n'importe quelle distribution Linux populaire et convient à la fois aux configurations VPS personnelles et aux environnements de production. Bien que l'installation initiale ne prenne que 10 à 15 minutes, elle peut vous faire gagner des heures de dépannage par la suite.

Qu'est-ce que le script va surveiller ?

Voici les principaux contrôles de santé du système que nous inclurons dans le script :

  • Utilisation du disque – pour détecter un espace de stockage faible avant que cela ne cause des problèmes.
  • Charge CPU – pour repérer une charge anormalement élevée sur le serveur.
  • Utilisation de la mémoire – pour identifier la pression mémoire ou les fuites.
  • Services échoués – pour savoir si un service systemd s'est écrasé ou a échoué silencieusement.
  • Top 5 des processus gourmands en mémoire et en CPU – pour trouver les applications gourmandes.
  • Temps de fonctionnement du système – pour suivre les redémarrages inattendus.
  • Mises à jour de paquet disponibles (facultatif) – aide à maintenir votre système sécurisé et à jour.

Avec cette liste de contrôle, vous obtiendrez un aperçu clair de l'état de votre système, automatiquement chaque jour.

Étape 1 : Créez le script de vérification de l'état de santé

Créez un nouveau fichier appelé system-health.sh dans votre répertoire préféré, par exemple, /opt/scripts.

sudo mkdir -p /opt/scripts
sudo nano /opt/scripts/system-health.sh

Maintenant, copiez et collez le script suivant dedans :

#!/bin/bash

Author: Ravi Saive (Tecmint)
Description: Simple System Health Check Script

LOGFILE="/var/log/system-health-$(date +%F).log"
HOSTNAME=$(hostname)
DATE=$(date)

{
echo "============================================"
echo " System Health Report for $HOSTNAME"
echo " Generated on: $DATE"
echo "============================================"

Disk Usage
echo -e "\nDisk Usage:"
printf "%-20s %-10s %-10s %-10s %-6s %-s\n" "Filesystem" "Size" "Used" "Avail" "Use%" "Mounted on"
df -h --output=source,size,used,avail,pcent,target | tail -n +2

CPU Load
echo -e "\nCPU Load (1/5/15 min average):"
uptime | awk -F'load average:' '{ print "  " $2 }'

Memory Usage
echo -e "\nMemory Usage:"
free -h | awk 'NR==1 || /Mem|Swap/ { printf "  %-10s %-10s %-10s %-10s %-10s %-10s\n", $1, $2, $3, $4, $5, $6 }'

Failed Services
echo -e "\nFailed Systemd Services:"
FAILED=$(systemctl --failed --no-legend)
if [ -z "$FAILED" ]; then
    echo "  No failed services."
else
    echo "$FAILED" | while read -r line; do
        echo "  $line"
    done
fi

Top 5 Memory-Consuming Processes
echo -e "\nTop 5 Memory Consuming Processes:"
ps -eo user,pid,%cpu,%mem,command --sort=-%mem | head -n 6 | \
awk '{ printf "  %-10s %-6s %-6s %-6s %-s\n", $1, $2, $3, $4, substr($0, index($0,$5), 60) }'

Top 5 CPU-Consuming Processes
echo -e "\nTop 5 CPU Consuming Processes:"
ps -eo user,pid,%cpu,%mem,command --sort=-%cpu | head -n 6 | \
awk '{ printf "  %-10s %-6s %-6s %-6s %-s\n", $1, $2, $3, $4, substr($0, index($0,$5), 60) }'

Uptime
echo -e "\nSystem Uptime:"
echo "  $(uptime -p)"

Package Updates
echo -e "\nAvailable Package Updates:"
if command -v apt &> /dev/null; then
    UPDATES=$(apt list --upgradable 2>/dev/null | grep -v "Listing...")
    if [ -z "$UPDATES" ]; then
        echo "  System is up to date."
    else
        echo "$UPDATES" | awk '{ print "  " $0 }'
    fi
elif command -v dnf &> /dev/null; then
    dnf check-update || echo "  System is up to date."
elif command -v yum &> /dev/null; then
    yum check-update || echo "  System is up to date."
else
    echo "  Package manager not supported."
fi

echo -e "\nEnd of Report"

} > "$LOGFILE"

Optional: Send report via mail (if mail is configured)
MAIL_TO="[email "
if command -v mail > /dev/null 2>&1; then
    mail -s "Daily Health Report for $HOSTNAME" "$MAIL_TO" < "$LOGFILE"
fi

Appuyez sur CTRL+O, ENTRÉE pour enregistrer, CTRL+X pour quitter, puis rendez le script exécutable en utilisant :

sudo chmod +x /opt/scripts/system-health.sh

Étape 2 : Tester le script manuellement (avant l'automatisation)

Avant de laisser Cron gérer le travail, il est conseillé d'exécuter le script manuellement pour s'assurer que tout fonctionne comme prévu.

sudo /opt/scripts/system-health.sh

Vous devriez voir un rapport bien structuré avec des détails sur l'utilisation du disque, la charge du CPU, les statistiques de la mémoire, les services échoués, et plus encore.

cat /var/log/system-health-$(date +%F).log

Si tout semble en ordre, vous êtes prêt à l'automatiser avec Cron.

Étape 2 : Configurer un travail Cron

Maintenant que votre script est prêt, il est temps de l'automatiser en utilisant cron, un outil intégré à Linux qui exécute des tâches à des moments programmés.

Pour exécuter le script de vérification de santé tous les jours à 7h, ouvrez le crontab de l'utilisateur root. Comme nous vérifions les ressources au niveau système, il est préférable d'exécuter le script en tant qu'utilisateur root :

sudo crontab -e

Au bas du fichier, ajoutez la ligne suivante :

0 7 * * * /opt/scripts/system-health.sh

Si vous voulez sauvegarder la sortie ou les erreurs du travail cron, vous pouvez modifier la ligne comme ceci :

0 7 * * * /opt/scripts/system-health.sh >> /var/log/system-health-cron.log 2>&1

Étape 3 : Configurer le courrier (Facultatif mais utile)

Si vous voulez recevoir le rapport par e-mail, assurez-vous que votre serveur peut envoyer des mails – sur la plupart des systèmes, il suffit simplement d’installer mailutils.

sudo apt install mailutils -y  [On Debian/Ubuntu]
sudo dnf install mailx -y      [On CentOS/RHEL]

Vous devrez peut-être également configurer Postfix ou SSMTP pour relayer correctement les e-mails, surtout si vous êtes sur une VM cloud.

Étape 4 : Affichage de l'état du système dans le MOTD (Message du jour)

Un lecteur a eu une excellente idée d'afficher une version brève de ce contrôle de santé en tant que MOTD lors de la connexion à votre serveur, ce qui est une façon intelligente de voir instantanément l'état de santé du système sans exécuter de commandes.

Créez un script MOTD léger et enregistrez ce script sous /etc/update-motd.d/99-system-health.


#!/bin/bash
Lightweight System Health MOTD
Author: Ravi Saive (Tecmint)

echo "==== 🩺 System Health: $(hostname) ===="
echo "🕒 Uptime: $(uptime -p)"
echo "💽 Disk: $(df -h / | awk 'NR==2 {print $5 " used on " $6}')"
echo "📊 CPU Load: $(uptime | awk -F'load average:' '{print $2}' | sed 's/^ //')"
echo "🧠 Memory: $(free -m | awk '/Mem:/ {print $3 "MB used / " $2 "MB total"}')"
FAILED=$(systemctl --failed --no-legend | wc -l)
echo "🚨 Failed Services: $FAILED"
echo "====================================="

Rendez-le exécutable :


sudo chmod +x /etc/update-motd.d/99-system-health

Cette méthode fonctionne sur Ubuntu et les systèmes basés sur Debian où le MOTD dynamique est activé par défaut. Pour d'autres distributions, vous pouvez inclure ce script dans .bashrc ou .bash_profile.

Désormais, chaque fois que vous vous connecterez en SSH à votre serveur, vous obtiendrez un aperçu rapide de l’état de votre système – aucune étape supplémentaire nécessaire !


==== 🩺 System Health: server01 ====
🕒 Uptime: up 2 days, 4 hours
💽 Disk: 68% used on /
📊 CPU Load: 0.12, 0.21, 0.25
🧠 Memory: 842MB used / 1987MB total
🚨 Failed Services: 0
=====================================
Conclusion

Avec ce script Bash + configuration Cron, vous pouvez automatiser les vérifications quotidiennes de l'état et recevoir un rapport clair directement dans votre boîte mail. Fini de deviner si votre disque est plein ou si un service a échoué en silence en arrière-plan.

Ça fonctionne simplement, chaque jour, et vous apporte la tranquillité d'esprit.

💬 Si vous avez aimé cet article ou avez des suggestions pour l'améliorer, n'hésitez pas à laisser un commentaire ci-dessous.