Introduction
Lorsqu’un script s’exécute, il crée souvent des fichiers temporaires ou lance des processus en arrière-plan. Si vous interrompez le script, par exemple en appuyant sur Ctrl+C, ces fichiers temporaires restent souvent sur le système et l’encombrent.
Pour éviter cela, un script doit pouvoir détecter son arrêt et effectuer les opérations de nettoyage nécessaires.
Sous Linux, nous utilisons la commande trap pour intercepter les signaux d’interruption et les événements de sortie. Les signaux sont l’un des moyens utilisés par le système d’exploitation pour communiquer avec les processus. Par exemple, lorsque vous appuyez sur Ctrl+C, le système envoie généralement le signal SIGINT pour demander au processus de s’arrêter.
Vous pouvez ainsi définir une procédure « à la sortie » afin que le script effectue son nettoyage avant de se terminer.
Dans ce laboratoire, vous allez :
- Créer un script qui génère des fichiers temporaires.
- Interrompre le script pour observer les fichiers restants.
- Mettre en place un trap pour supprimer automatiquement les fichiers temporaires à la sortie.
Créer un processus de longue durée
Commencez par créer un script qui simule une tâche de longue durée. Il créera un fichier temporaire, puis attendra indéfiniment.
Les scripts de longue durée sont courants dans les tâches d’administration. Ils peuvent surveiller un journal, attendre une entrée, interroger périodiquement un service ou traiter des tâches au fil du temps. Plus un script s’exécute longtemps, plus le nettoyage devient important lorsqu’une interruption survient.
Créez et ouvrez long_process.sh dans le répertoire du projet :
cd ~/project
nano long_process.sh
Saisissez ce code :
#!/bin/bash
## Create a temporary file
touch temp_data.txt
echo "Temporary file 'temp_data.txt' created."
## Fall asleep (Simulate a long job)
echo "Process is running. Press Ctrl+C to stop..."
while true; do
sleep 1
done
Enregistrez le fichier (Ctrl+O, puis Enter), puis quittez l’éditeur (Ctrl+X).
Rendez le script exécutable :
chmod +x long_process.sh
Le problème : si vous exécutez ce script, puis l’arrêtez avec Ctrl+C, le fichier temp_data.txt reste sur le disque. C’est une mauvaise pratique, car des exécutions répétées peuvent remplir l’espace disque avec des fichiers inutiles.
Les fichiers temporaires sont un exemple classique, mais le même problème peut concerner des fichiers de verrouillage, des sockets, des points de montage ou des processus auxiliaires en arrière-plan. Le nettoyage consiste à laisser le système dans un état prévisible.
Définir une fonction de nettoyage
Pour gérer correctement le nettoyage, il est recommandé de définir une fonction spécifique qui contient toute la logique de nettoyage.
Placer le nettoyage dans une fonction distincte permet de garder le script organisé. La même logique peut également être réutilisée depuis différents chemins de sortie, au lieu d’être copiée à plusieurs endroits.
Ouvrez à nouveau le script :
nano long_process.sh
Ajoutez la fonction cleanup au début du script :
#!/bin/bash
## Define the cleanup function
cleanup() {
echo ""
echo "Cleaning up temporary files..."
rm -f temp_data.txt
echo "Cleanup complete."
}
## Create a temporary file
touch temp_data.txt
echo "Temporary file 'temp_data.txt' created."
## Simulate a long-running process
echo "Process is running. Press Ctrl+C to stop..."
while true; do
sleep 1
done
Enregistrez le fichier, puis quittez l’éditeur.
À ce stade, vous avez défini la fonction, mais vous n’avez pas encore indiqué au script quand l’appeler.
Configurer un trap pour intercepter les signaux
Nous allons maintenant utiliser la commande trap pour indiquer à Bash : « Si vous recevez un signal d’interruption, comme celui envoyé par Ctrl+C, exécutez la fonction cleanup. »
C’est l’un des exemples les plus clairs d’un script shell qui réagit à des événements du système d’exploitation, et pas seulement à des entrées textuelles. Un signal est un message asynchrone envoyé par le système ou par l’utilisateur à un processus. La commande trap donne au script la possibilité d’y répondre de manière contrôlée.
Ouvrez le script :
nano long_process.sh
Ajoutez la commande trap sous la définition de la fonction, mais avant le début de la logique principale.
#!/bin/bash
cleanup() {
echo ""
echo "Cleaning up temporary files..."
rm -f temp_data.txt
echo "Cleanup complete."
exit
}
## Register the trap
## SIGINT = Ctrl+C
## EXIT = Any exit (success or failure)
trap cleanup SIGINT EXIT
## The rest of the script...
touch temp_data.txt
echo "Temporary file 'temp_data.txt' created."
echo "Process is running. Press Ctrl+C to stop..."
while true; do
sleep 1
done
Comprendre les arguments de trap :
cleanup: la commande ou la fonction à exécuter ;SIGINT: le signal envoyé lorsque vous appuyez surCtrl+C;EXIT: un pseudo-signal déclenché chaque fois que le script se termine, quelle qu’en soit la raison.
L’utilisation conjointe de SIGINT et de EXIT rend le nettoyage plus fiable. SIGINT couvre l’interruption courante au clavier, tandis que EXIT fournit une protection plus générale lors d’une terminaison normale et dans de nombreux cas d’échec.
Enregistrez le fichier, puis quittez l’éditeur.
Vérifier le nettoyage
Vérifiez maintenant que le mécanisme fonctionne.
Exécutez le script :
./long_process.sh
Le script crée temp_data.txt, puis commence son exécution.
Interrompez-le en appuyant sur Ctrl+C.
Vous devriez voir la sortie suivante :
^C
Cleaning up temporary files...
Cleanup complete.
Vérifiez enfin que le fichier a bien été supprimé :
ls temp_data.txt
La commande doit renvoyer une erreur semblable à celle-ci :
ls: cannot access 'temp_data.txt': No such file or directory
La commande trap a correctement intercepté le signal d’arrêt et exécuté votre code de nettoyage avant la fin du script.
Il s’agit d’une bonne pratique des scripts professionnels : lorsqu’un script crée un état temporaire, il doit également définir comment cet état sera supprimé. trap est l’un des principaux outils fournis par Bash pour cette tâche.
Résumé
Dans ce laboratoire, vous avez appris à écrire des scripts robustes à l’aide de Trap.
- Signaux : comprendre que
Ctrl+Cenvoie le signalSIGINTau processus ; - Trap : utiliser
trappour intercepter des signaux et exécuter du code spécifique ; - Nettoyage : automatiser les tâches d’entretien afin de garder un système propre.
Les scripts professionnels gèrent toujours les différents scénarios de sortie afin d’éviter la corruption des données et les fichiers résiduels.



