L’artisan des scripts

ShellBeginner
Pratiquer maintenant

Introduction

Bienvenue, futur administrateur système ! Vous venez de rejoindre une entreprise technologique très active en tant qu’ingénieur DevOps junior. Votre collègue senior prend des vacances bien méritées, et une tâche critique vient d’arriver sur votre bureau. Le serveur principal de l’application génère de nombreux fichiers journaux, qui consomment rapidement l’espace disque. Votre mission, si vous l’acceptez, consiste à devenir l’artisan des scripts.

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, puis vous lui ajouterez progressivement des fonctionnalités : variables, saisie utilisateur, vérification des erreurs et boucles. À la fin de ce défi, vous aurez créé un script capable de sauvegarder et de gérer des fichiers, démontrant ainsi votre valeur à l’équipe et vous permettant de sauver la situation !

À vos scripts !

Avis important
Ce défi couvre des compétences qui vont au-delà de Quick Start with Linux. Si vous n’avez pas encore étudié ces notions, passez ce défi pour le moment et poursuivez avec Linux for Noobs, le cours suivant du parcours d’apprentissage Linux.
Quand revenir :
  1. Terminez le laboratoire guidé Shell Scripting Fundamentals, puis revenez essayer ce défi.

Écrire un script shell simple

Votre première tâche consiste à poser les bases. Tout bon script commence par une seule ligne. Vous devez créer le fichier du script et y ajouter une commande élémentaire pour vérifier qu’il fonctionne correctement. Cette première étape confirme que votre environnement est correctement configuré 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 la ligne « shebang » (#!/bin/bash) tout en haut du script. Elle indique au système quel interpréteur utiliser.
  • Ajoutez une commande qui affiche le message "Log Manager Initialized." à l’écran.
  • Rendez le script exécutable à l’aide de la commande chmod +x.

Exigences

  • Le script doit être nommé log_manager.sh.
  • Le script doit se trouver dans le répertoire ~/project.
  • La première ligne doit être #!/bin/bash.
  • Le script doit utiliser la commande echo pour afficher le message demandé.
  • 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, la procédure complète doit ressembler à ceci :

Commencez par vérifier que le fichier du script existe :

ls ~/project/
log_manager.sh

Définissez les permissions d’exécution du script :

chmod +x ~/project/log_manager.sh

Exécutez maintenant le script :

./log_manager.sh

Le script doit afficher :

Log Manager Initialized.

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

cat ~/project/log_manager.sh

Le fichier doit 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 sert à afficher une ligne de texte.
  • Utilisez chmod +x filename pour rendre un script exécutable. L’option +x ajoute les permissions d’exécution pour le propriétaire du fichier.

Ajouter des variables et une saisie utilisateur

Un script contenant uniquement des valeurs codées en dur est peu 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 de saisir un libellé pour l’exécution de la sauvegarde. Le script pourra ainsi s’adapter à différentes situations sans modifier directement son code.

Tâches

  • Modifiez votre script log_manager.sh.
  • Définissez une variable nommée LOG_DIR et affectez-lui le chemin /home/labex/project/app_logs.
  • Ajoutez une ligne qui affiche "Enter the backup filename: " afin de demander une saisie à l’utilisateur.
  • Utilisez la commande read pour enregistrer la saisie de l’utilisateur dans une nouvelle variable appelée BACKUP_FILENAME.
  • Ajoutez une dernière commande echo pour confirmer les paramètres, en affichant un message tel que "Backing up logs to: [filename]", où [filename] correspond à 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 saisie de l’utilisateur.
  • La saisie de l’utilisateur doit être enregistré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 à l’utilisateur, puis afficher le message de confirmation. L’interaction doit ressembler à ceci :

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

Le script doit s’interrompre à l’invite "Enter the backup filename:", en attendant que l’utilisateur saisisse un nom et appuie sur Entrée. Après la saisie, il affiche le message de confirmation en utilisant la valeur fournie. Dans ce défi, cette valeur est un libellé d’exécution affiché dans la sortie ; l’opération de sauvegarde réelle sera mise en œuvre à l’étape 4 en copiant les fichiers .log dans ~/project/backups.

Conseils

  • Pour définir une variable, utilisez la syntaxe VARIABLE_NAME="value". Il ne doit y avoir aucun espace autour du signe =.
  • Pour utiliser la valeur d’une variable, faites précéder son nom du signe $, par exemple $MY_VARIABLE.
  • La commande read interrompt le script et attend que l’utilisateur saisisse quelque chose, puis appuie sur Entrée.

Implémenter une logique conditionnelle

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

Tâches

  • Modifiez votre script log_manager.sh.
  • Ajoutez une instruction if pour vérifier que le répertoire indiqué par la variable $LOG_DIR existe.
  • Si le répertoire existe, le script doit continuer comme précédemment (demande du nom de fichier, etc.).
  • Si le répertoire n’existe pas, le script doit afficher le message d’erreur "Error: Log directory not found." et se terminer immédiatement avec un code d’état différent de zéro.

Exigences

  • Le script doit utiliser une instruction if.
  • La condition doit vérifier l’existence d’un répertoire à l’aide de l’opérateur de test -d.
  • Si le répertoire n’existe pas, le script doit utiliser echo pour afficher le message d’erreur indiqué.
  • Si le répertoire n’existe pas, le script doit se terminer avec 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 se terminer :

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

Dans ce cas, le script se termine immédiatement après l’affichage du message d’erreur, sans demander de saisie à l’utilisateur ni effectuer d’opération de sauvegarde.

Conseils

  • La syntaxe d’une instruction if simple est if [ condition ]; then ... else ... fi.
  • Le test [ -d "$DIRECTORY_PATH" ] renvoie vrai si $DIRECTORY_PATH existe et correspond à un répertoire.
  • exit 1 est une manière standard d’indiquer qu’un script s’est terminé avec une erreur.

Parcourir les fichiers pour effectuer les opérations

Voici le cœur de l’automatisation ! Vous devez traiter les fichiers du répertoire des journaux. Vous utiliserez une boucle for pour parcourir tous les fichiers se terminant par .log dans le répertoire app_logs. Dans ce défi, vous allez simplement les copier dans un nouveau répertoire de sauvegarde. La saisie BACKUP_FILENAME reste un libellé d’exécution affiché dans la sortie ; le script ne crée pas de fichier d’archive portant ce nom.

Tâches

  • Commencez par créer un répertoire nommé backups dans ~/project, où les fichiers journaux seront copiés.
  • Modifiez votre script log_manager.sh.
  • Dans le bloc if (là où l’existence du répertoire est confirmée), ajoutez une boucle for.
  • La boucle doit parcourir tous les fichiers se terminant par .log dans le répertoire $LOG_DIR.
  • Dans 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 de $LOG_DIR correspondant au motif *.log.
  • La commande cp doit être utilisée dans la boucle pour copier les fichiers vers ~/project/backups.
  • Une instruction echo doit signaler le nom de chaque fichier au moment de sa copie.

Exemples

Une fois cette étape terminée, lorsque vous exécutez le script avec un nom de fichier de sauvegarde, il doit traiter tous les fichiers journaux et afficher un résultat semblable à celui-ci :

./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 du répertoire et afficher un message "Copied" pour chaque fichier. Les noms exacts dépendent 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 à l’aide de la commande mkdir.
  • Une boucle for destinée aux fichiers peut s’écrire for file in /path/to/*.log; do ... done.
  • La syntaxe de la commande cp est cp <source> <destination>.
  • La variable de boucle (par exemple file) contient le chemin complet du fichier à chaque itération.

Résumé

Félicitations, artisan des scripts ! Vous avez créé avec succès un script shell complet et fonctionnel à partir de zéro. Vous avez pris en charge un problème concret — la gestion de fichiers journaux — et l’avez résolu grâce à l’automatisation.

Dans ce défi, vous avez maîtrisé plusieurs notions fondamentales des scripts shell :

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

Votre script peut maintenant vérifier automatiquement l’existence des répertoires de journaux, traiter tous les fichiers journaux et les copier vers un emplacement de sauvegarde. Il s’agit d’une étape importante dans votre parcours d’ingénieur DevOps ou d’administrateur système. Les compétences que vous avez mises en pratique constituent la base de scripts d’automatisation bien plus complexes, capables de gérer des serveurs, de déployer des applications et de traiter des données. Vous avez prouvé que vous pouviez assumer des responsabilités et fournir une solution fonctionnelle. 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