Introduction
Bienvenue, futur administrateur système ! Vous venez de rejoindre une entreprise technologique en pleine effervescence 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), et ces derniers s'accumulent rapidement, menaçant de saturer 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 de log. Il ne s'agit pas seulement de lancer quelques commandes, mais de construire un outil robuste et réutilisable. Vous commencerez par un script simple et ajouterez progressivement des fonctionnalités telles que des variables, la saisie utilisateur, la vérification 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 !
C'est parti pour le scripting !
- Passez temporairement le défi et continuez avec les laboratoires guidés suivants dans le parcours d'apprentissage Linux.
- Discutez avec Labby ou consultez la solution.
Écrire un script shell simple
Votre première tâche consiste à poser les fondations. Tout grand script commence par une seule ligne. Vous devez créer le fichier du 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.shdans 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 à l'aide de 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
echopour afficher le message requis. - Le script doit posséder les permissions d'exécution (utilisez
chmod +x log_manager.sh).
Exemples
Après avoir créé et rendu le script exécutable, le processus complet devrait ressembler à ceci :
Tout d'abord, vérifiez que le fichier du script existe :
ls ~/project/
log_manager.sh
Définissez les permissions d'exécution sur le script :
chmod +x ~/project/log_manager.sh
Maintenant, lancez 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 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
echoest utilisée pour afficher une ligne de texte. - Utilisez
chmod +x nom_du_fichierpour rendre un script exécutable. Le+xajoute les droits d'exécution pour le propriétaire du fichier.
Ajout de variables et saisie utilisateur
Un script dont les valeurs sont figées 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 logs et demanderez à l'utilisateur de saisir un nom pour l'archive de sauvegarde. Cela permet au script de s'adapter à 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_DIRet affectez-lui le chemin/home/labex/project/app_logs. - Ajoutez une ligne pour afficher "Enter the backup filename: " afin d'inviter l'utilisateur à saisir une information.
- Utilisez la commande
readpour capturer la saisie de l'utilisateur dans une nouvelle variable appeléeBACKUP_FILENAME. - Ajoutez une commande
echofinale 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_DIRdéfinie sur/home/labex/project/app_logs. - Le script doit utiliser la commande
readpour obtenir une saisie de l'utilisateur. - La saisie utilisateur doit être stockée dans une variable nommée
BACKUP_FILENAME. - La sortie finale doit utiliser la variable
$BACKUP_FILENAME.
Exemples
Lorsque vous lancez le script modifié, il doit demander une saisie à l'utilisateur et afficher le message de confirmation. Voici à quoi devrait ressembler l'interaction :
./log_manager.sh
Log Manager Initialized.
Enter the backup filename: my_backup_2024.tar.gz
Backing up logs to: my_backup_2024.tar.gz
Le script doit s'interrompre à l'invite "Enter the backup filename:", en attendant que l'utilisateur tape un nom de fichier et appuie sur Entrée. Une fois la saisie effectuée, il affiche le message de confirmation en utilisant le nom de fichier fourni.
Conseils
- Pour définir une variable, utilisez la syntaxe
NOM_VARIABLE="valeur". Il ne doit pas y avoir d'espaces autour du signe=. - Pour utiliser la valeur d'une variable, faites précéder son nom du signe
$, comme$MA_VARIABLE. - La commande
readmet le script en pause et attend que l'utilisateur tape quelque chose et appuie sur Entrée.
Mise en œuvre de la logique conditionnelle
Un bon script anticipe les problèmes. Que se passe-t-il si le répertoire de logs 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 de logs existe avant de tenter toute opération.
Tâches
- Modifiez votre script
log_manager.sh. - Ajoutez une instruction
ifpour vérifier si le répertoire spécifié par la variable$LOG_DIRexiste. - 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 s'arrêter immédiatement avec un code d'état non nul.
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 afficher (
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 de logs 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 logs n'existe pas, le script doit afficher une erreur et s'arrêter :
./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.
Dans ce cas, le script s'arrête immédiatement après l'affichage du message d'erreur, sans demander de saisie utilisateur ni procéder aux opérations de sauvegarde.
Conseils
- La syntaxe d'une instruction
ifde base estif [ condition ]; then ... else ... fi. - Le test
[ -d "$DIRECTORY_PATH" ]renvoie vrai si$DIRECTORY_PATHexiste et est un répertoire. exit 1est une manière standard de signaler qu'un script s'est terminé avec une erreur.
Boucler sur les opérations de fichiers
Voici maintenant le cœur de l'automatisation ! Vous devez traiter les fichiers à l'intérieur du répertoire de logs. 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.
Tâches
- Tout d'abord, créez un répertoire nommé
backupsà l'intérieur de~/projectoù les fichiers de logs 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 bouclefor. - La boucle doit parcourir chaque fichier se terminant par
.logà l'intérieur du répertoire$LOG_DIR. - À l'intérieur de la boucle, utilisez la commande
cppour copier chaque fichier de log 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 à l'intérieur de la boucle pour copier les fichiers vers~/project/backups. - Une instruction
echodoit indiquer le nom de chaque fichier au fur et à mesure de sa copie.
Exemples
Une fois cette étape terminée, lorsque vous lancez le script avec un nom de fichier de sauvegarde, il doit traiter tous les fichiers de logs et afficher une sortie similaire à :
./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: full_backup.tar.gz
Backing up logs to: full_backup.tar.gz
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, en affichant un message "Copied" pour chacun. Les noms de fichiers exacts dépendront des fichiers de logs 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
forpour les fichiers peut s'écrire ainsi :for file in /chemin/vers/*.log; do ... done. - La syntaxe de la commande
cpestcp <source> <destination>. - La variable de boucle (par exemple,
file) contiendra le chemin complet du 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 vous êtes attaqué à un problème concret — la gestion des fichiers de logs — 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éation et structuration d'un script avec un shebang.
- Utilisation de variables pour rendre votre script dynamique.
- Capture de la saisie utilisateur avec
read. - Mise en œuvre d'une vérification d'erreurs robuste avec des instructions
if. - Automatisation de tâches répétitives avec des boucles
for. - Gestion des permissions de fichiers et exécution de votre script.
Votre script peut désormais vérifier automatiquement l'existence de répertoires de logs, traiter tous les fichiers de logs et les copier vers un emplacement de sauvegarde. C'est une étape majeure dans votre parcours d'ingénieur DevOps ou d'administrateur système. Les compétences que vous avez exercées ici constituent le socle pour l'écriture 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 opérationnelle. Beau travail !



