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 profite de vacances bien méritées, et une tâche critique vient d’atterrir sur votre bureau. Le serveur principal de l’application génère de nombreux fichiers journaux, qui occupent 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 concevoir un outil fiable 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 conçu un script capable de sauvegarder et de gérer des fichiers, démontrant ainsi votre valeur auprès de l’équipe tout en sauvant la situation !
À vos scripts !
- Ignorez temporairement ce défi et poursuivez avec les ateliers guidés suivants du parcours d’apprentissage Linux.
- 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 du script et y ajouter une commande simple afin de vérifier qu’il fonctionne correctement. Cette première étape permet de confirmer 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.shdans le répertoire~/project. - Ajoutez une 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
echopour 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, le processus complet 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
nanopour créer et modifier le fichier. Par exemple :nano log_manager.sh. - La commande
echosert à afficher une ligne de texte. - Utilisez
chmod +x filenamepour rendre un script exécutable. Le+xajoute les permissions d’exécution pour le propriétaire du fichier.
Ajouter des variables et une saisie utilisateur
Un script dont les valeurs sont codées en dur manque de souplesse. Pour le rendre plus dynamique et réutilisable, vous allez maintenant introduire des variables. Vous définirez une variable correspondant au répertoire des journaux et demanderez à l’utilisateur de saisir un nom 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_DIRet affectez-lui le chemin/home/labex/project/app_logs. - Ajoutez une ligne qui affiche « Enter the backup filename: » pour inviter l’utilisateur à saisir une valeur.
- Utilisez la commande
readpour enregistrer la saisie de l’utilisateur dans une nouvelle variable appeléeBACKUP_FILENAME. - Ajoutez une dernière commande
echopour confirmer les paramètres, en affichant un message tel que « Backing up logs to: [filename] », où[filename]correspond à la valeur saisie.
Exigences
- Le script doit contenir une variable
LOG_DIRdéfinie sur/home/labex/project/app_logs. - Le script doit utiliser la commande
readpour recueillir une saisie utilisateur. - La saisie de l’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é, celui-ci doit demander une saisie et afficher un 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. Une fois la saisie fournie, il affiche le message de confirmation en utilisant la valeur entrée. Dans ce défi, cette valeur sert d’étiquette d’exécution affichée dans la sortie ; l’action réelle de sauvegarde est implémentée à 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
$, comme dans$MY_VARIABLE. - La commande
readmet le script en pause et attend que l’utilisateur saisisse une valeur, puis appuie sur Entrée.
Mettre en œuvre une logique conditionnelle
Un bon script sait anticiper 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 existe avant d’effectuer la moindre opération.
Tâches
- Modifiez votre script
log_manager.sh. - Ajoutez une instruction
ifpour vérifier que le répertoire indiqué par la variable$LOG_DIRexiste. - 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
echopour 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 de 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 de 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 ni effectuer d’opération de sauvegarde.
Conseils
- La syntaxe d’une instruction
ifsimple estif [ condition ]; then ... else ... fi. - Le test
[ -d "$DIRECTORY_PATH" ]renvoie vrai si$DIRECTORY_PATHexiste et correspond à un répertoire. exit 1est une manière standard d’indiquer qu’un script s’est terminé à la suite d’une erreur.
Parcourir les opérations sur les fichiers avec une boucle
Voici le cœur de l’automatisation ! Vous devez traiter les fichiers du répertoire de 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 une étiquette d’exécution affichée dans la sortie ; elle ne correspond pas à un fichier d’archive créé par le script.
Tâches
- Commencez par créer un répertoire nommé
backupsdans~/project, dans lequel les fichiers journaux seront copiés. - Modifiez votre script
log_manager.sh. - À l’intérieur du bloc
if(lorsque l’existence du répertoire a été confirmée), ajoutez une bouclefor. - La boucle doit parcourir tous les fichiers se terminant par
.logdans le répertoire$LOG_DIR. - Dans la boucle, utilisez la commande
cppour 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/backupsdepuis la ligne de commande. - Le script doit utiliser une boucle
for. - La boucle doit parcourir les fichiers de
$LOG_DIRcorrespondant au motif*.log. - La commande
cpdoit être utilisée dans la boucle pour copier les fichiers vers~/project/backups. - Une instruction
echodoit 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 sauvegarde, il doit traiter tous les fichiers journaux et afficher un résultat similaire à 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 chacun. 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 bien é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
forappliquée à des fichiers peut s’écrire ainsi :for file in /path/to/*.log; do ... done. - La syntaxe de la commande
cpestcp <source> <destination>. - À chaque itération, la variable de boucle (par exemple
file) contient le chemin complet du fichier.
Résumé
Félicitations, artisan des scripts ! Vous avez construit 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 à la puissance de l’automatisation.
Au cours de ce défi, vous avez maîtrisé plusieurs notions fondamentales des scripts shell :
- Créer et structurer un script avec une ligne shebang.
- Utiliser des variables pour rendre un script dynamique.
- Recueillir 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 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. Il s’agit d’une étape majeure dans votre parcours d’ingénieur DevOps ou d’administrateur système. Les compétences acquises ici 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 démontré que vous saviez prendre des responsabilités et fournir une solution opérationnelle. Bravo !



