Skip to content

Identifier le nom du signal reçu dans Bash

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



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.