Solution:
(Si vous n’avez que le numéro d’un signal et que vous voulez le nom, kill -l $SIGNAL_NUM
imprime le nom d’un signal ; vous pouvez éviter cela en utilisant les noms des signaux au lieu des numéros dans votre appel à trap
comme ci-dessous.)
Cette réponse dit qu’il n’y a aucun moyen d’accéder au nom du signal, mais si vous avez une fonction distincte pour chaque signal que vous interceptez, alors vous connaissez déjà le nom du signal :
trap 'echo trapped the HUP signal' HUP
trap 'echo different trap for the INT signal' INT
Dans de nombreux cas, cela peut être suffisant, mais une autre réponse à cette même question utilise ce fait pour fournir une solution de contournement pour simuler le comportement que vous souhaitez. Il prend une fonction et une liste de signaux et définit un piège séparé pour chaque signal sur cette fonction appelée avec le nom du signal, donc en interne c’est en fait une fonction distincte pour chaque signal mais cela ressemble à un seul piège sur une seule fonction qui obtient le nom du signal comme argument :
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
echo "Send signals to PID $$ and type [enter] when done."
read # Wait so the script doesn't exit.
Si je l’exécute, alors je peux envoyer des signaux au processus et j’obtiens une sortie comme
Trapped: INT
Trapped: TERM
Trapped: EXIT
Dans le piège (lorsqu’il est déclenché via un signal), le $? variable est initialement définie sur le numéro de signal plus 128, vous pouvez donc affecter le numéro de signal à une variable en faisant la première déclaration de l’action de trap à quelque chose comme
sig=$(($? - 128))
Vous pouvez ensuite obtenir le nom du signal en utilisant la commande kill
kill -l $sig
une façon simple de le faire :
_handler() {
signal=$1
echo signal was $signal
}
trap '_handler SIGTERM' SIGTERM
trap '_handler SIGINT' SIGINT