Présentation
Un script shell peut rencontrer des problèmes lors de son exécution, ce qui entraîne un signal d'erreur qui interrompt le script de manière inattendue.
Les erreurs se produisent en raison d'une conception de script défectueuse, d'actions de l'utilisateur ou de défaillances du système. Un script qui échoue peut laisser derrière lui des fichiers temporaires qui causent des problèmes lorsqu'un utilisateur redémarre le script.
Ce tutoriel vous montrera comment utiliser le trap
pour vous assurer que vos scripts se terminent toujours de manière prévisible.
Prérequis
- Accès au terminal/ligne de commande.
- Un éditeur de texte (Nano, Vi/Vim, etc.).
Syntaxe du piège bash
La syntaxe du trap
la commande est :
trap [options] "[arguments]" [signals]
La commande a les composants suivants :
- Options fournir des fonctionnalités supplémentaires à la commande.
- Argumentation sont les commandes
trap
s'exécute lors de la détection d'un signal. À moins que la commande ne comporte qu'un seul mot, elle doit être entourée de guillemets (" "
). Si l'argument contient plusieurs commandes, séparez-les par un point-virgule (;
). - Signaux sont des notifications asynchrones envoyées par le système, indiquant généralement une interruption générée par l'utilisateur ou liée au système. Les signaux peuvent être appelés par leur nom ou leur numéro.
Options de piège bash
Le trap
La commande accepte les options suivantes :
-p
- Affiche les commandes de signal.-l
- Imprime une liste de tous les signaux et leurs numéros.
Ci-dessous la liste complète des 64 signaux et leurs numéros :
# | Signal | # | Signal | # | Signal |
---|---|---|---|---|---|
1 | SIGHUP | 23 | SIGURG | 45 | SIGRTMIN+11 |
2 | SIGINT | 24 | SIGXCPU | 46 | SIGRTMIN+12 |
3 | SIGQUIT | 25 | SIGXFSZ | 47 | SIGRTMIN+13 |
4 | SIGILL | 26 | SIGVTALRM | 48 | SIGRTMIN+14 |
5 | SIGTRAP | 27 | SIGPROF | 49 | SIGRTMIN+15 |
6 | SIGABRT | 28 | SIGWINCH | 50 | SIGRTMAX-14 |
7 | SIGBUS | 29 | SIGIO | 51 | SIGRTMAX-13 |
8 | SIGFPE | 30 | SIGPWR | 52 | SIGRTMAX-12 |
9 | SIGKILL | 31 | SIGSYS | 53 | SIGRTMAX-11 |
10 | SIGUSR1 | 32 | SIGATTENTE | 54 | SIGRTMAX-10 |
11 | SIGSEGV | 33 | SIGNALWP | 55 | SIGRTMAX-9 |
12 | SIGUSR2 | 34 | SIGRTMIN | 56 | SIGRTMAX-8 |
13 | SIGPIPE | 35 | SIGRTMIN+1 | 57 | SIGRTMAX-7 |
14 | SIGALRM | 36 | SIGRTMIN+2 | 58 | SIGRTMAX-6 |
15 | SIGTERM | 37 | SIGRTMIN+3 | 59 | SIGRTMAX-5 |
16 | SIGSTKFLT | 38 | SIGRTMIN+4 | 60 | SIGRTMAX-4 |
17 | SIGCHLD | 39 | SIGRTMIN+5 | 61 | SIGRTMAX-3 |
18 | SIGCON | 40 | SIGRTMIN+6 | 62 | SIGRTMAX-2 |
19 | SIGSTOP | 41 | SIGRTMIN+7 | 63 | SIGRTMAX-1 |
20 | SIGTSTP | 42 | SIGRTMIN+8 | 64 | SIGRTMAX |
21 | SIGTTIN | 43 | SIGRTMIN+9 | ||
22 | SIGTTOU | 44 | SIGRTMIN+10 |
Les signaux les plus couramment utilisés avec le trap
commande sont :
SIGHUP (1)
- Rangement propreSIGINT (2)
- InterrompreSIGQUIT (3)
- QuitterSIGABRT (6)
- AnnulerSIGALRM (14)
- RéveilSIGTERM (15)
- Terminer
Comment utiliser le piège dans Bash
Un scénario typique d'utilisation du trap
la commande attrape le SIGINT
signal. Ce signal est envoyé par le système lorsque l'utilisateur interrompt l'exécution du script en appuyant sur Ctrl+C .
L'exemple de script suivant imprime le mot "Test " toutes les secondes jusqu'à ce que l'utilisateur l'interrompe avec Ctrl+C . Le script affiche alors un message et se ferme.
trap "echo The script is terminated; exit" SIGINT
while true
do
echo Test
sleep 1
done
Le while
loop dans l'exemple ci-dessus s'exécute à l'infini. La première ligne du script contient le trap
commande et les instructions pour attendre le SIGINT
signal, puis imprimez le message et quittez le script.
Le trap
La commande est fréquemment utilisée pour nettoyer les fichiers temporaires si le script se termine en raison d'une interruption. L'exemple suivant définit le cleanup
fonction, qui imprime un message, supprime tous les fichiers ajoutés au $TRASH
variable et quitte le script.
$TRASH=$(mktemp -t tmp.XXXXXXXXXX)
trap cleanup 1 2 3 6
cleanup()
{
echo "Removing temporary files:"
rm -rf "$TRASH"
exit
}
...
Le trap
dans l'exemple ci-dessus exécute le cleanup
fonctionne lorsqu'il détecte l'un des quatre signaux :SIGHUP
, SIGINT
, SIGQUIT
, ou SIGABRT
. Les signaux sont désignés par leur numéro.
Vous pouvez également utiliser trap
pour s'assurer que l'utilisateur ne peut pas interrompre l'exécution du script. Cette fonctionnalité est importante lors de l'exécution de commandes sensibles dont l'interruption peut endommager définitivement le système. La syntaxe pour désactiver un signal est :
trap "" [signal]
Les guillemets doubles signifient qu'aucune commande ne sera exécutée. Par exemple, pour piéger le SIGINT
et SIGABRT
signaux, tapez :
trap "" SIGINT SIGABRT
[a command that must not be interrupted]
Si vous souhaitez réactiver les signaux à tout moment pendant le script, réinitialisez les règles en utilisant le symbole du tiret :
trap - SIGINT SIGABRT
[a command that can be interrupted]