JOUR 10 : L'artisan du script

LinuxBeginner
Pratiquer maintenant

Introduction

Bienvenue, futur administrateur système ! Vous venez de rejoindre une entreprise technologique dynamique en tant qu'ingénieur DevOps junior. Votre collègue senior est en vacances bien méritées, et une tâche critique vient d'atterrir sur votre bureau. Le serveur d'application principal génère de nombreux fichiers journaux (logs) qui consomment rapidement l'espace disque. Votre mission, si vous l'acceptez, est de devenir l'Artisan du script.

Vous devez créer un script shell automatisé pour gérer ces fichiers journaux. Il ne s'agit pas simplement d'exécuter quelques commandes, mais de construire un outil robuste et réutilisable. Vous commencerez par un script simple pour y ajouter progressivement des fonctionnalités telles que des variables, des entrées utilisateur, des vérifications d'erreurs et des boucles. À la fin de ce défi, vous aurez conçu un script capable de sauvegarder et de gérer des fichiers, prouvant ainsi votre valeur à l'équipe et sauvant la mise !

À vos scripts !

Avis important
Les défis à venir peuvent dépasser le cadre du cours Démarrage rapide avec Linux.
Si vous rencontrez des difficultés pendant le défi :
  1. Sautez temporairement le défi et poursuivez avec les laboratoires guidés suivants dans le parcours d'apprentissage Linux.
  2. Discutez avec Labby ou consultez la solution.

Écrire un script shell simple

Votre première tâche consiste à poser les bases. Tout grand script commence par une seule ligne. Vous devez créer le fichier de script et ajouter une commande de base pour vous assurer qu'il fonctionne correctement. Cette étape initiale confirme que votre configuration est correcte et que vous êtes prêt à construire une logique plus complexe.

Tâches

  • Créez un nouveau fichier de script shell nommé log_manager.sh dans le répertoire ~/project.
  • Ajoutez une ligne "shebang" (#!/bin/bash) tout en haut du script. Cela indique au système quel interpréteur utiliser.
  • Ajoutez une commande pour afficher le message "Log Manager Initialized." à l'écran.
  • Rendez le script exécutable en utilisant la commande chmod +x.

Exigences

  • Le script doit être nommé log_manager.sh.
  • Le script doit être situé dans le répertoire ~/project.
  • La première ligne doit être #!/bin/bash.
  • Le script doit utiliser la commande echo pour afficher le message requis.
  • Le script doit disposer des permissions d'exécution (utilisez chmod +x log_manager.sh).

Exemples

Après avoir créé le script et l'avoir rendu exécutable, le processus complet devrait ressembler à ceci :

Tout d'abord, vérifiez que le fichier de script existe :

ls ~/project/
log_manager.sh

Définissez les permissions d'exécution sur le script :

chmod +x ~/project/log_manager.sh

Exécutez maintenant le script :

./log_manager.sh

Le script devrait afficher :

Log Manager Initialized.

Vous pouvez également vérifier que le contenu du script est correct :

cat ~/project/log_manager.sh

Le fichier devrait contenir :

#!/bin/bash

echo "Log Manager Initialized."

Conseils

  • Vous pouvez utiliser un éditeur de texte en ligne de commande comme nano pour créer et modifier le fichier. Par exemple : nano log_manager.sh.
  • La commande echo est utilisée pour afficher une ligne de texte.
  • Utilisez chmod +x nom_de_fichier pour rendre un script exécutable. Le +x ajoute les permissions d'exécution pour le propriétaire du fichier.

Ajouter des variables et des entrées utilisateur

Un script codé en dur n'est pas très flexible. Pour rendre votre script plus dynamique et réutilisable, vous allez maintenant introduire des variables. Vous définirez une variable pour le répertoire des journaux et demanderez à l'utilisateur une étiquette pour la sauvegarde. Cela rend le script adaptable à différentes situations sans avoir à modifier le code lui-même.

Tâches

  • Modifiez votre script log_manager.sh.
  • Définissez une variable nommée LOG_DIR et assignez-lui le chemin /home/labex/project/app_logs.
  • Ajoutez une ligne pour afficher "Enter the backup filename: " afin de demander une saisie à l'utilisateur.
  • Utilisez la commande read pour capturer l'entrée de l'utilisateur dans une nouvelle variable appelée BACKUP_FILENAME.
  • Ajoutez une commande echo finale pour confirmer les paramètres, en affichant un message tel que "Backing up logs to: [filename]", où [filename] est la valeur saisie par l'utilisateur.

Exigences

  • Le script doit contenir une variable LOG_DIR définie sur /home/labex/project/app_logs.
  • Le script doit utiliser la commande read pour obtenir une entrée de l'utilisateur.
  • L'entrée utilisateur doit être stockée dans une variable nommée BACKUP_FILENAME.
  • La sortie finale doit utiliser la variable $BACKUP_FILENAME.

Exemples

Lorsque vous exécutez le script modifié, il doit demander une saisie utilisateur et afficher le message de confirmation. Voici à quoi devrait ressembler l'interaction :

./log_manager.sh
Log Manager Initialized.
Enter the backup filename: daily_backup
Backing up logs to: daily_backup

Le script doit s'arrêter à l'invite "Enter the backup filename:", en attendant que l'utilisateur tape un nom et appuie sur Entrée. Une fois l'entrée fournie, il affiche le message de confirmation en utilisant la valeur saisie. Dans ce défi, cette valeur est une étiquette de exécution affichée dans la sortie, tandis que l'action de sauvegarde réelle sera implémentée à l'étape 4 en copiant les fichiers .log dans ~/project/backups.

Conseils

  • Pour définir une variable, utilisez la syntaxe NOM_VARIABLE="valeur". Il ne doit y avoir aucun espace autour du signe =.
  • Pour utiliser la valeur d'une variable, faites précéder son nom d'un signe $, comme $MA_VARIABLE.
  • La commande read met le script en pause et attend que l'utilisateur tape quelque chose et appuie sur Entrée.

Implémenter la logique conditionnelle

Un bon script anticipe les problèmes. Que se passe-t-il si le répertoire de journaux que vous avez spécifié n'existe pas ? Le script échouerait. Pour rendre votre script plus robuste, vous devez ajouter une logique conditionnelle. Vous utiliserez une instruction if pour vérifier si le répertoire des journaux existe avant de tenter toute opération.

Tâches

  • Modifiez votre script log_manager.sh.
  • Ajoutez une instruction if pour vérifier si le répertoire spécifié par la variable $LOG_DIR existe.
  • Si le répertoire existe, le script doit continuer comme avant (demander le nom de fichier, etc.).
  • Si le répertoire n'existe pas, le script doit afficher un message d'erreur "Error: Log directory not found." et quitter immédiatement avec un code de sortie différent de zéro.

Exigences

  • Le script doit utiliser une instruction if.
  • La condition doit vérifier l'existence d'un répertoire en utilisant l'opérateur de test -d.
  • Si le répertoire n'existe pas, le script doit echo le message d'erreur spécifié.
  • Si le répertoire n'existe pas, le script doit se terminer en utilisant exit 1.

Exemples

Lorsque le répertoire des journaux existe, le script doit s'exécuter normalement :

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz

Si le répertoire des journaux n'existe pas, le script doit afficher une erreur et quitter :

./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.

Dans ce cas, le script se termine immédiatement après avoir affiché le message d'erreur, sans demander de saisie utilisateur ni procéder à des opérations de sauvegarde.

Conseils

  • La syntaxe d'une instruction if de base est if [ condition ]; then ... else ... fi.
  • Le test [ -d "$CHEMIN_REPERTOIRE" ] renvoie vrai si $CHEMIN_REPERTOIRE existe et est un répertoire.
  • exit 1 est un moyen standard de signaler qu'un script s'est terminé avec une erreur.

Parcourir les opérations sur les fichiers

Passons maintenant au cœur de l'automatisation ! Vous devez traiter les fichiers dans le répertoire des journaux. Vous utiliserez une boucle for pour parcourir tous les fichiers se terminant par .log dans le répertoire app_logs. Pour ce défi, vous allez simplement les copier dans un nouveau répertoire de sauvegarde. L'entrée BACKUP_FILENAME reste une étiquette affichée dans la sortie, et non un fichier d'archive créé par le script.

Tâches

  • Tout d'abord, créez un répertoire nommé backups dans ~/project où les fichiers journaux seront copiés.
  • Modifiez votre script log_manager.sh.
  • À l'intérieur du bloc if (là où l'existence du répertoire est confirmée), ajoutez une boucle for.
  • La boucle doit parcourir chaque fichier se terminant par .log dans le répertoire $LOG_DIR.
  • À l'intérieur de la boucle, utilisez la commande cp pour copier chaque fichier journal dans le répertoire ~/project/backups.
  • Pour chaque fichier copié, affichez un message tel que "Copied [filename]".

Exigences

  • Vous devez d'abord créer le répertoire ~/project/backups depuis la ligne de commande.
  • Le script doit utiliser une boucle for.
  • La boucle doit parcourir les fichiers dans $LOG_DIR qui correspondent au motif *.log.
  • La commande cp doit être utilisée à l'intérieur de la boucle pour copier les fichiers vers ~/project/backups.
  • Une instruction echo doit signaler le nom de chaque fichier au fur et à mesure de sa copie.

Exemples

Après avoir terminé cette étape, lorsque vous exécutez le script avec un nom de fichier de sauvegarde, il doit traiter tous les fichiers journaux et afficher une sortie similaire à :

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.

Le script doit parcourir chaque fichier .log dans le répertoire, en affichant un message "Copied" pour chaque fichier. Les noms de fichiers exacts dépendront des fichiers journaux présents dans votre répertoire app_logs.

Une fois le script terminé, vous pouvez vérifier que les fichiers ont été copiés en consultant le répertoire backups :

ls ~/project/backups/
access.log  debug.log  error.log

Conseils

  • Vous pouvez créer un répertoire en utilisant la commande mkdir.
  • Une boucle for pour les fichiers peut s'écrire for file in /chemin/vers/*.log; do ... done.
  • La syntaxe de la commande cp est cp <source> <destination>.
  • La variable de boucle (par exemple, file) contiendra le chemin complet vers le fichier à chaque itération.

Résumé

Félicitations, Artisan du script ! Vous avez réussi à construire un script shell complet et fonctionnel à partir de zéro. Vous avez relevé un problème réel — la gestion des fichiers journaux — et l'avez résolu grâce à la puissance de l'automatisation.

Dans ce défi, vous avez maîtrisé plusieurs concepts fondamentaux du scripting shell :

  • Créer et structurer un script avec un shebang.
  • Utiliser des variables pour rendre votre script dynamique.
  • Capturer les entrées utilisateur avec read.
  • Implémenter une vérification d'erreurs robuste avec des instructions if.
  • Automatiser les tâches répétitives avec des boucles for.
  • Gérer les permissions de fichiers et exécuter votre script.

Votre script peut désormais vérifier automatiquement l'existence des répertoires de journaux, traiter tous les fichiers journaux et les copier vers un emplacement de sauvegarde. C'est une étape importante dans votre parcours en tant qu'ingénieur DevOps ou administrateur système. Les compétences que vous avez pratiquées ici constituent la base pour écrire des scripts d'automatisation beaucoup plus complexes capables de gérer des serveurs, de déployer des applications et de traiter des données. Vous avez prouvé que vous pouvez assumer des responsabilités et fournir une solution opérationnelle. Bravo !

✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer