Lorsqu’un signal est reçu, je peux exécuter des commandes en utilisant trap
. Exemple:
trap 'echo hello world' 1 2
Si l’un des signaux spécifiés est reçu, le monde salut est affiché.
Mais comment puis-je imprimer / identifier le nom du signal reçu?
(Si vous n’avez que le numéro d’un signal et que vous voulez le nom, kill -l $SIGNAL_NUM
le nom d’un signal; vous pouvez éviter cela en utilisant les noms de signaux au lieu de numéros dans votre appel à trap
comme ci-dessous.)
Cette réponse indique que la seule façon d’identifier le signal que vous avez piégé dans bash est d’écrire un wrapper distinct pour chaque signal différent que vous souhaitez intercepter. Une autre réponse à cette même question fournit une fonction d’encapsulation à faire pour vous:
Code:
#!/bin/bash trap_with_arg() { func="$1" ; shift for sig ; do trap "$func $sig" "$sig" done } func_trap() { echo Trapped: $1 } trap_with_arg func_trap INT TERM EXIT read # Wait so the script doesn't exit.
Si je lance cela, alors je peux envoyer des signaux au processus et j’obtiens une sortie comme
Trapped: INT Trapped: TERM Trapped: EXIT
Dans le piège (déclenché par un signal), le $? La variable est initialement définie sur le numéro du signal plus 128, de sorte que vous pouvez atsortingbuer le numéro de signal à une variable en faisant en sorte que la première instruction de l’action de trap ait quelque chose comme
sig=$(($? - 128))
Vous pouvez alors obtenir le nom du signal en utilisant la commande kill
kill -l $sig
un moyen simple de le faire:
_handler() { signal=$1 echo signal was $signal } trap '_handler SIGTERM' SIGTERM trap '_handler SIGINT' SIGINT