Par Alice Durand, Ingénieure DevOps

Combien de temps avez-vous passé à observer manuellement la performance de vos sites web, redoutant un ralentissement soudain ou une interruption de service ? Ce suivi manuel, bien que nécessaire, peut vite devenir une tâche chronophage et source d’erreurs, surtout lorsque l’on gère plusieurs sites ou applications. Imaginez un outil capable de vous alerter instantanément en cas de problème, vous permettant ainsi de réagir rapidement et de minimiser l’impact sur vos utilisateurs.

L’automatisation du monitoring de la performance web est cruciale pour maintenir une expérience utilisateur optimale, un bon référencement (SEO), et des revenus stables. Un site web lent ou inaccessible peut entraîner une perte de clients, une baisse du positionnement dans les moteurs de recherche, et une diminution du chiffre d’affaires. Il existe une solution simple et puissante pour automatiser ce suivi : Bash, et plus précisément, ses capacités conditionnelles. Ce guide vous guidera à travers les étapes nécessaires pour utiliser efficacement les conditions Bash afin de monitorer la performance web et de réagir aux problèmes en temps réel.

Comprendre les conditions bash

Les conditions Bash sont le fondement de l’automatisation et de la prise de décision dans les scripts shell. Elles permettent à un script d’exécuter différentes actions en fonction de la valeur d’une variable, du résultat d’une commande, ou de l’état d’un fichier. La maîtrise des conditions Bash est donc essentielle pour automatiser le monitoring de la performance web. Cette section explore les bases des conditions Bash, en expliquant les instructions `if`, `then`, `else`, `elif`, et `fi`, ainsi que les différents opérateurs de comparaison et les commandes de test disponibles.

Présentation des conditions bash

En Bash, une condition commence généralement par le mot-clé `if`, suivi d’une expression à évaluer. Si l’expression est vraie (retourne un code de sortie 0), le code situé entre `then` et `else` (ou `fi` s’il n’y a pas de `else`) est exécuté. Si l’expression est fausse (retourne un code de sortie différent de 0), le code situé entre `else` et `fi` est exécuté, s’il existe. L’instruction `elif` permet d’enchaîner plusieurs conditions. La structure générale est la suivante : (Voir la documentation officielle de Bash ici )

 if [ condition ]; then # Code à exécuter si la condition est vraie elif [ autre condition ]; then # Code à exécuter si l'autre condition est vraie else # Code à exécuter si aucune condition n'est vraie fi 

Opérateurs de comparaison

Les opérateurs de comparaison permettent de comparer des valeurs et de déterminer si une condition est vraie ou fausse. Il existe différents types d’opérateurs de comparaison, notamment pour les nombres, les chaînes de caractères, et les fichiers.

  • Opérateurs numériques : `-eq` (égal à), `-ne` (différent de), `-gt` (supérieur à), `-lt` (inférieur à), `-ge` (supérieur ou égal à), `-le` (inférieur ou égal à). Par exemple, `if [ « $nombre » -gt 10 ]; then … fi` vérifie si la variable `nombre` est supérieure à 10.
  • Opérateurs de chaînes de caractères : `==` (égal à), `!=` (différent de), `-z` (chaîne vide), `-n` (chaîne non vide). Il est crucial d’utiliser des guillemets autour des variables contenant des chaînes de caractères pour éviter les erreurs, surtout si les chaînes contiennent des espaces. Par exemple, `if [ « $chaine » == « exemple » ]; then … fi`.
  • Opérateurs de fichiers : `-f` (fichier existe et est un fichier régulier), `-d` (fichier existe et est un répertoire), `-e` (fichier existe), `-x` (fichier est exécutable), `-r` (fichier est lisible), `-w` (fichier est inscriptible). Ces opérateurs sont particulièrement utiles pour vérifier l’existence de fichiers de log, la possibilité d’écrire dans un fichier, etc. Par exemple, `if [ -f « /var/log/mon_application.log » ]; then … fi`.

Opérateurs logiques

Les opérateurs logiques permettent de combiner plusieurs conditions. Les principaux opérateurs logiques sont `&&` (AND), `||` (OR), et `!` (NOT).

  • `&&` (AND) : La condition est vraie si les deux opérandes sont vrais. Exemple: `if [ « $a » -gt 10 ] && [ « $b » -lt 20 ]; then … fi`
  • `||` (OR) : La condition est vraie si au moins un des opérandes est vrai. Exemple: `if [ « $a » -eq 10 ] || [ « $b » -eq 20 ]; then … fi`
  • `!` (NOT) : Inverse la valeur de l’opérande. Exemple: `if ! [ -f « /tmp/fichier.txt » ]; then … fi` (vérifie si le fichier n’existe pas).

Commandes de test : `test` et `[ ]`

Les commandes `test` et `[ ]` sont similaires et permettent d’évaluer des expressions conditionnelles. L’utilisation de `[ ]` est généralement préférée pour une meilleure lisibilité. Notamment, l’espace entre les crochets et l’expression est obligatoire. Il faut également noter que les deux commandes diffèrent dans leur gestion des espaces et des caractères spéciaux. En effet, `test` est une commande POSIX standard, tandis que `[ ]` est une construction du shell Bash, qui peut avoir un comportement différent dans certaines situations (voir Arguments ).

Exemples simples

Voici quelques exemples simples d’utilisation des conditions Bash :

 # Vérifier si un nombre est pair nombre=12 if [ $((nombre % 2)) -eq 0 ]; then echo "Le nombre $nombre est pair" else echo "Le nombre $nombre est impair" fi # Vérifier si un fichier existe fichier="/tmp/mon_fichier.txt" if [ -f "$fichier" ]; then echo "Le fichier $fichier existe" else echo "Le fichier $fichier n'existe pas" fi 

Outils pour le monitoring de la performance web avec bash

Bash, combiné avec des outils en ligne de commande performants, devient un allié précieux pour le monitoring de la performance web. Cette section explore les outils essentiels que vous pouvez utiliser dans vos scripts Bash pour automatiser le monitoring de vos sites web, allant de la vérification des codes de statut HTTP à la mesure du temps de réponse et à l’analyse du contenu.

curl

`curl` est un outil polyvalent pour effectuer des requêtes HTTP. Il permet de vérifier le code de statut HTTP, de mesurer le temps de réponse, et de vérifier le contenu d’un site web. C’est l’outil de base pour interagir avec des serveurs web depuis un script Bash (voir la documentation officielle ici ).

  • Vérifier le code de statut HTTP : La commande `curl -s -o /dev/null -w « %{http_code} » « https://www.example.com »` renvoie le code de statut HTTP du site web « https://www.example.com ». Vous pouvez ensuite utiliser une condition Bash pour vérifier si le code est 200 (succès) ou un autre code indiquant une erreur. Par exemple, si le code est 503 (Service Unavailable), vous pouvez envoyer une alerte.
  • Mesurer le temps de réponse : L’option `-w` de `curl` permet d’obtenir des informations détaillées sur le temps de connexion, de transfert, et le temps total. La commande `curl -s -w « Temps de connexion : %{time_connect}snTemps total : %{time_total}sn » « https://www.example.com » -o /dev/null` affiche le temps de connexion et le temps total pour charger la page. Ces valeurs peuvent être utilisées pour détecter des ralentissements.
  • Vérifier le contenu du site : Vous pouvez utiliser `curl` pour télécharger le code HTML d’un site web et ensuite utiliser `grep` pour rechercher des chaînes de caractères spécifiques. Cela permet de s’assurer que le contenu du site est correct et que les éléments importants sont présents.

ping

`ping` est un outil simple, mais efficace pour vérifier la connectivité à un serveur et mesurer la latence. Il envoie des paquets ICMP (Internet Control Message Protocol) au serveur cible et attend une réponse. Il est important de noter que certains pare-feux peuvent bloquer les requêtes `ping`.

  • Explication de l’ICMP : L’ICMP est un protocole utilisé pour envoyer des messages de contrôle et d’erreur entre les équipements réseau. `ping` utilise l’ICMP pour vérifier si un serveur est accessible et pour mesurer le temps nécessaire pour que les paquets atteignent le serveur et reviennent.
  • Analyse de la sortie : La commande `ping -c 3 www.example.com` envoie 3 paquets `ping` au site web `www.example.com`. L’analyse de la sortie permet de déterminer la perte de paquets (si certains paquets ne sont pas renvoyés) et le temps de réponse moyen, minimal, et maximal. Une perte de paquets élevée (plus de 1%) ou un temps de réponse élevé (plus de 200ms) peuvent indiquer un problème de connectivité.

grep

`grep` est un outil puissant pour rechercher des motifs spécifiques dans des fichiers de texte ou dans la sortie d’autres commandes. Il est particulièrement utile pour analyser le code HTML d’un site web et rechercher des mots-clés ou des expressions spécifiques. Par exemple, pour vérifier si le mot « important » est présent, utilisez `grep important fichier.html` (voir le manuel de `grep` ici ).

awk et sed

`awk` et `sed` sont des outils de manipulation de texte très performants. `awk` permet d’extraire des informations spécifiques de la sortie de commandes, tandis que `sed` permet de modifier la sortie des commandes et de la formater. Ces outils peuvent être utilisés pour extraire des données de performance de la sortie de `curl` ou `ping` et pour formater les alertes. Par exemple, avec `awk`, on peut facilement extraire une colonne d’un tableau.

Scénarios de monitoring automatisé avec bash

Maintenant que nous avons exploré les bases des conditions Bash et les outils essentiels pour le monitoring web, il est temps de passer à la pratique. Cette section présente des exemples concrets de scripts Bash pour automatiser le monitoring de différents aspects de la performance web, tels que la vérification du code de statut HTTP, le suivi du temps de réponse, et la vérification de la présence de mots-clés. Chaque exemple comprend un script complet, une condition Bash spécifique, et une action d’alerte.

Vérification du code de statut HTTP

Ce script vérifie le code de statut HTTP d’une URL et envoie une alerte si le code est différent de 200. De nombreux sites utilisent des codes 301, 302 pour les redirections. Pour une analyse exhaustive, il peut être utile de traquer l’ensemble des codes (voir codes HTTP ).

 #!/bin/bash URL="https://www.example.com" http_code=$(curl -s -o /dev/null -w "%{http_code}" "$URL") if [ "$http_code" -ne 200 ]; then echo "Erreur : Code HTTP $http_code pour $URL" >> /var/log/mon_script.log echo "Erreur HTTP $http_code pour $URL" | mail -s "Alerte HTTP" mon_email@example.com fi 

Condition : `if [ « $http_code » -ne 200 ]; then … fi`

Alerte : Enregistrement de l’erreur dans un fichier de log et envoi d’un email.

Suivi du temps de réponse

Ce script mesure le temps de réponse d’une URL et envoie une alerte si le temps dépasse un seuil prédéfini.

 #!/bin/bash URL="https://www.example.com" threshold=1.0 # Seuil de 1 seconde response_time=$(curl -s -w "%{time_total}" "$URL" -o /dev/null) if (( $(echo "$response_time > $threshold" | bc -l) )); then echo "Alerte : Temps de réponse de $URL : $response_time secondes (dépasse le seuil de $threshold secondes)" | mail -s "Alerte Temps de Réponse" mon_email@example.com fi 

Condition : `if (( $(echo « $response_time > $threshold » | bc -l) )); then … fi`

Alerte : Envoi d’un email avec le temps de réponse et l’URL concernée.

Vérification de la présence de mots-clés

Ce script vérifie si un mot-clé spécifique est présent dans le code HTML d’une URL.

 #!/bin/bash URL="https://www.example.com" keyword="Exemple" html_content=$(curl -s "$URL") if grep -q "$keyword" <<< "$html_content"; then echo "Le mot-clé '$keyword' est présent dans $URL" else echo "Alerte : Le mot-clé '$keyword' est absent de $URL" | mail -s "Alerte Mot-Clé Absent" mon_email@example.com fi 

Condition : `if grep -q « $keyword » <<< « $html_content »; then … else … fi`

Alerte : Signalement de l’absence du mot-clé, ce qui pourrait indiquer une erreur de contenu.

Suivi de la charge du serveur (via SSH)

Ce script se connecte à un serveur distant via SSH et vérifie si la charge moyenne dépasse un seuil prédéfini.

 #!/bin/bash HOST="user@example.com" threshold=5.0 load_average=$(ssh "$HOST" "uptime | awk '{print $(NF-2)}' | tr -d ,") if (( $(echo "$load_average > $threshold" | bc -l) )); then echo "Alerte : Charge du serveur $HOST : $load_average (dépasse le seuil de $threshold)" | mail -s "Alerte Charge Serveur" mon_email@example.com fi 

Condition : Analyse de la sortie de `uptime` pour vérifier si la charge moyenne dépasse un seuil.

Alerte : Envoi d’un email avec la charge du serveur et le nom d’hôte si la charge est trop élevée.

Tableau comparatif des outils de suivi

Outil Fonction Avantages Inconvénients
curl Requêtes HTTP Polyvalent, détaillé, supporte SSL Nécessite une bonne compréhension des options, peut être bloqué par certains pare-feux.
ping Vérification de la connectivité Simple, rapide, consomme peu de ressources Informations limitées, peut être bloqué par des pare-feux.
grep Recherche de motifs Puissant, flexible, permet des recherches complexes Peut être lent sur de gros fichiers, syntaxe parfois complexe.

Aller plus loin : combinaison et orchestration

Le monitoring automatisé ne se limite pas à l’exécution de scripts individuels. Pour un suivi plus efficace, il est essentiel de combiner plusieurs vérifications dans un seul script, d’utiliser des boucles pour suivre plusieurs URLs, de gérer les erreurs, de journaliser les événements, et de planifier l’exécution des scripts. Cette section explore les techniques d’orchestration et de combinaison pour créer des solutions de monitoring plus robustes et scalables.

  • Combiner plusieurs vérifications dans un seul script : Un script peut vérifier à la fois le code de statut HTTP, le temps de réponse, et la présence de mots-clés pour une URL donnée. Cela permet de centraliser le suivi et de simplifier la gestion des alertes.
  • Utiliser des boucles `for` et `while` : Les boucles permettent de suivre plusieurs URLs ou d’effectuer des vérifications à intervalles réguliers. Par exemple, une boucle `for` peut être utilisée pour parcourir une liste d’URLs et vérifier leur statut HTTP. Une boucle `while` peut être utilisée pour exécuter un script de monitoring toutes les 5 minutes.
  • Gestion des erreurs : L’utilisation de `set -e` permet de quitter le script immédiatement en cas d’erreur. Une gestion plus robuste des erreurs peut être implémentée en utilisant des conditions `if` pour vérifier le code de retour des commandes et prendre des actions appropriées en cas d’erreur.
  • Journalisation : L’enregistrement des événements importants (erreurs, alertes, etc.) dans un fichier de log permet de suivre l’état du suivi et de diagnostiquer les problèmes. La commande `date` peut être utilisée pour ajouter un horodatage aux entrées de log. Il est conseillé d’utiliser `logger` pour une gestion plus robuste des logs.
  • Planification avec `cron` : `cron` est un outil puissant pour planifier l’exécution de tâches à intervalles réguliers. Il permet d’exécuter les scripts Bash de monitoring automatiquement. Pour les environnements plus complexes, considérez l’utilisation d’outils comme `systemd` ou `Ansible`.

Exemple d’intégration des outils

Intégration Description Exemple
Curl & Grep Vérification du contenu dynamique `curl « url » | grep « mot_clé »` (vérifie si « mot_clé » est présent)
Ping & Condition Suivi de la disponibilité `if ping -c 1 « url »; then echo « OK »; else echo « KO »; fi` (Vérifie si l’URL répond au ping)

Alertes et notifications avancées

Le monitoring automatisé n’est utile que s’il génère des alertes en cas de problème. Cette section explore les différentes méthodes pour envoyer des alertes et des notifications à partir de vos scripts Bash. Au-delà de l’envoi d’emails avec `mail`, nous explorerons l’intégration avec des services de notification tels que Slack, PagerDuty, et l’utilisation de solutions de monitoring plus avancées comme Prometheus et Grafana. Il est essentiel de choisir la méthode d’alerte la plus appropriée en fonction de vos besoins et de votre infrastructure.

  • Envoi d’emails avec `mail` : La commande `mail` permet d’envoyer des emails à partir de la ligne de commande. Il est nécessaire de configurer `mail` correctement pour que les emails soient envoyés avec succès. Les messages d’alerte doivent être clairs et concis, indiquant le problème détecté, l’URL concernée, et la date et l’heure de l’événement. Il est également possible d’utiliser `sendmail` pour une configuration plus fine.
  • Intégration avec des services de notification (Slack, PagerDuty, etc.) : Les services de notification tels que Slack et PagerDuty offrent des API qui permettent d’envoyer des notifications via des requêtes HTTP (utilisant `curl`). L’intégration avec ces services permet de recevoir des alertes directement sur votre téléphone ou votre ordinateur, et de gérer les incidents plus efficacement.
  • Intégration avec Prometheus et Grafana : Pour une solution de monitoring plus complète, envisagez d’intégrer vos scripts Bash avec Prometheus pour la collecte de métriques et Grafana pour la visualisation et l’alerte. Cela permet de créer des tableaux de bord personnalisés et de définir des règles d’alerte basées sur des seuils complexes.

Temps de réponse moyen des sites web en 2023 : Selon Semrush , le temps de réponse moyen d’un site web est de 2.9 secondes. Pourcentage de sites web indisponibles : Internet Live Stats , estime qu’environ 0.5% des sites web sont indisponibles à un instant donné.

Bonnes pratiques et optimisation pour le monitoring web avec bash

Pour garantir l’efficacité et la fiabilité de vos scripts Bash de monitoring, il est essentiel de suivre certaines bonnes pratiques et d’optimiser le code. Cette section présente les principales recommandations en matière de sécurité, de lisibilité, de modularité, de performance, et de gestion des dépendances. L’adoption de ces pratiques vous permettra de créer des scripts robustes, maintenables, et performants.

  • Sécurité : Évitez d’utiliser des mots de passe en clair dans les scripts Bash. Utilisez des variables d’environnement ou des fichiers de configuration sécurisés pour stocker les informations sensibles. Validez les entrées utilisateur pour éviter les injections de commandes. Utilisez `chmod 700` pour restreindre l’accès aux scripts.
  • Lisibilité : Utilisez des noms de variables clairs et descriptifs. Commentez le code pour expliquer ce qu’il fait. Utilisez une indentation cohérente. Utilisez des fonctions pour organiser le code et faciliter la réutilisation.
  • Modularité : Décomposez les scripts en fonctions pour une meilleure organisation et réutilisabilité. Créez des fichiers de configuration externes pour stocker les paramètres (URLs, seuils, etc.).
  • Performance : Évitez d’exécuter des commandes inutiles. Utilisez des commandes efficaces. Mettez en cache les résultats des commandes pour éviter de les exécuter à plusieurs reprises (par exemple, en stockant le résultat de `curl` dans une variable). Utilisez `nohup` pour exécuter les scripts en arrière-plan et éviter qu’ils ne soient interrompus.
  • Gestion des dépendances : Assurez-vous que toutes les commandes nécessaires (curl, ping, etc.) sont installées sur le système. Utilisez un système de gestion des paquets (apt, yum, etc.) pour installer les dépendances. Documentez les dépendances dans un fichier README.
  • Gestion des logs : Mettez en place une rotation des logs (logrotate) pour éviter que les fichiers de log ne deviennent trop volumineux. Utilisez un format de log standard (par exemple, JSON) pour faciliter l’analyse des logs. Centralisez les logs dans un système de gestion des logs centralisé (par exemple, ELK Stack).

En moyenne, un administrateur système passe environ 20% de son temps à résoudre les problèmes de performance web. L’automatisation du monitoring peut réduire ce temps de 50% (source: Atlassian ).

En conclusion

L’utilisation des conditions Bash pour automatiser le monitoring de la performance web offre une solution flexible, simple et efficace pour identifier rapidement les problèmes et optimiser la disponibilité de vos sites web. Grâce à des outils tels que `curl`, `ping`, `grep`, et `awk`, vous pouvez créer des scripts Bash personnalisés pour monitorer différents aspects de la performance web et recevoir des alertes en temps réel. Ces outils sont cruciaux dans un contexte DevOps, de plus en plus répandu (voir BMC ).

Bien que Bash présente des limites en termes de scalabilité et de maintenance pour les grands environnements, il reste un outil précieux pour les administrateurs systèmes, les développeurs DevOps, et les ingénieurs en fiabilité des sites (SRE) qui cherchent à automatiser le suivi de la performance web. N’hésitez pas à expérimenter avec les scripts Bash présentés dans ce guide et à les adapter à vos propres besoins. Pour aller plus loin, vous pouvez explorer des outils de monitoring plus sophistiqués et intégrer vos scripts Bash avec des plateformes de logging centralisées.