Commande trap Bash

LinuxLinuxBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous allons explorer la commande trap dans le scripting Bash. La commande trap est un outil puissant qui vous permet de capturer et de gérer les signaux, les interruptions et les entrées utilisateur dans vos scripts. En utilisant trap, vous pouvez définir des actions spécifiques à effectuer lorsque des signaux particuliers sont reçus, vous permettant ainsi de gérer les comportements imprévisibles et de gérer gracieusement diverses situations. Ce laboratoire est conçu pour les débutants et vous guidera tout au long du processus d'utilisation efficace de la commande trap.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) shell(("Shell")) -.-> shell/SystemInteractionandConfigurationGroup(["System Interaction and Configuration"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell(("Shell")) -.-> shell/FunctionsandScopeGroup(["Functions and Scope"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("Shebang") shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") shell/ControlFlowGroup -.-> shell/while_loops("While Loops") shell/FunctionsandScopeGroup -.-> shell/func_def("Function Definition") shell/SystemInteractionandConfigurationGroup -.-> shell/trap_statements("Trap Statements") subgraph Lab Skills linux/echo -.-> lab-388820{{"Commande trap Bash"}} shell/shebang -.-> lab-388820{{"Commande trap Bash"}} shell/comments -.-> lab-388820{{"Commande trap Bash"}} linux/touch -.-> lab-388820{{"Commande trap Bash"}} linux/chmod -.-> lab-388820{{"Commande trap Bash"}} linux/cd -.-> lab-388820{{"Commande trap Bash"}} shell/while_loops -.-> lab-388820{{"Commande trap Bash"}} shell/func_def -.-> lab-388820{{"Commande trap Bash"}} shell/trap_statements -.-> lab-388820{{"Commande trap Bash"}} end

Créer un script Bash

Commençons par créer un nouveau fichier de script Bash dans lequel nous allons implémenter la commande trap.

  1. Ouvrez un terminal dans le WebIDE. Vous devriez voir une invite se terminant par le symbole $.

  2. Accédez au répertoire du projet :

    cd ~/project

    Cette commande change votre répertoire de travail actuel en /home/labex/project.

  3. Créez un nouveau fichier nommé trap_example.sh :

    touch trap_example.sh

    La commande touch crée un fichier vide s'il n'existe pas, ou met à jour la date de modification s'il existe déjà.

  4. Ouvrez le fichier trap_example.sh dans l'éditeur du WebIDE. Vous pouvez le faire en cliquant sur le nom du fichier dans l'explorateur de fichiers à gauche du WebIDE.

Implémenter une commande trap de base

Maintenant, implémentons une commande trap de base dans notre script pour capturer des signaux spécifiques et quitter proprement.

  1. Ajoutez le contenu suivant au fichier trap_example.sh :

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up and exiting..."
      exit 0
    }
    
    trap cleanup_and_exit SIGINT SIGTERM
    
    echo "This script will run until you press Ctrl+C."
    echo "Press Ctrl+C to see the trap in action and exit gracefully."
    
    count=1
    while true; do
      echo "Script is running... (iteration $count)"
      sleep 1
      ((count++))
    done

    Analysons ce script :

    • La première ligne #!/bin/bash est appelée un shebang. Elle indique au système que ce script doit être exécuté par le shell Bash.
    • Nous définissons une fonction cleanup_and_exit qui affiche un message et quitte le script.
    • La commande trap est configurée pour appeler cleanup_and_exit lorsqu'elle capture soit le signal SIGINT (interruption) soit le signal SIGTERM (termination). SIGINT est généralement envoyé lorsque vous appuyez sur Ctrl+C, tandis que SIGTERM est souvent utilisé lorsqu'un processus est invité à se terminer proprement.
    • Les commandes echo affichent des instructions pour l'utilisateur.
    • La boucle while s'exécute indéfiniment, affichant un message et incrémentant un compteur toutes les secondes.
  2. Enregistrez le fichier après avoir ajouté le contenu.

Rendre le script exécutable et le lancer

Avant de pouvoir exécuter notre script, nous devons le rendre exécutable. Cela indique au système que ce fichier est autorisé à être exécuté comme un programme.

  1. Dans le terminal, rendez le script exécutable :

    chmod +x ~/project/trap_example.sh

    La commande chmod modifie les permissions d'un fichier. L'option +x ajoute la permission d'exécution.

  2. Exécutez le script :

    ~/project/trap_example.sh

    Cette commande demande à Bash d'exécuter notre script.

  3. Le script commencera à s'exécuter. Vous verrez les instructions affichées à l'écran. Laissez-le s'exécuter quelques secondes.

  4. Maintenant, appuyez sur Ctrl+C pour l'interrompre. Vous devriez voir le message "Signal received!" avant que le script ne se termine. C'est notre trap en action!

Modifier le trap pour utiliser une fonction

Au lieu d'utiliser une fonction simple, modifions notre script pour utiliser une fonction plus complexe avec la commande trap. Cela nous permet d'effectuer des actions plus détaillées lorsqu'un signal est reçu.

  1. Ouvrez le fichier trap_example.sh dans l'éditeur du WebIDE.

  2. Remplacez le contenu du fichier par le suivant :

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up..."
      echo "Performing cleanup tasks..."
      ## Add any necessary cleanup code here
      echo "Cleanup completed."
      echo "Exiting script gracefully."
      exit 0
    }
    
    trap cleanup_and_exit SIGINT SIGTERM
    
    echo "This script will run until you press Ctrl+C."
    echo "Press Ctrl+C to see the trap function in action and exit gracefully."
    
    count=1
    while true; do
      echo "Script is running... (iteration $count)"
      sleep 1
      ((count++))
    done

    Examinons les modifications :

    • Nous avons étendu la fonction cleanup_and_exit pour inclure des messages plus détaillés et un emplacement pour les tâches de nettoyage.
    • La fonction simule maintenant un processus de nettoyage plus réaliste, qui pourrait inclure des tâches telles que la fermeture des descripteurs de fichiers, la suppression de fichiers temporaires ou la libération d'autres ressources.
    • Nous avons mis à jour la boucle principale pour afficher un compteur d'itérations, ce qui rend plus clair le fait que le script est en cours d'exécution.
  3. Enregistrez le fichier après avoir effectué ces modifications.

  4. Exécutez le script à nouveau et testez-le en appuyant sur Ctrl+C :

    ~/project/trap_example.sh

    Vous devriez voir les nouveaux messages de la fonction cleanup_and_exit lorsque vous interrompez le script, ce qui démontre une sortie propre.

Résumé

Dans ce laboratoire (lab), vous avez appris à utiliser la commande trap dans les scripts Bash. Vous avez créé un script qui capture des signaux spécifiques et définit les actions à effectuer lorsque ces signaux sont reçus. Vous avez exploré différentes façons d'utiliser la commande trap, y compris l'utilisation de commandes inline et de fonctions.

La commande trap est un outil puissant pour gérer les interruptions et effectuer des actions de nettoyage dans vos scripts Bash. Elle vous permet de créer des applications en ligne de commande plus robustes et conviviales en gérant correctement les terminaisons inattendues et les interruptions utilisateur.

N'oubliez pas que la capacité à gérer les signaux peut être cruciale dans de nombreux scénarios de scripting, comme garantir le nettoyage approprié des fichiers temporaires, fermer les connexions réseau ou sauvegarder l'état avant qu'un script ne se termine de manière inattendue.