(Si sólo tiene el número de una señal y desea que el nombre, kill -l $SIGNAL_NUM
imprime el nombre de una señal, se puede evitar que al utilizar los nombres de las señales en lugar de números en su llamada a trap
como sigue.)
This answer dice que la única forma de identificar qué señal atrapada en bash es escribir un contenedor por separado para cada señal diferente que desee capturar. Another answer on that same question proporciona una función de envoltura que lo haga por usted:
Código:
#!/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 me quedo eso, entonces puedo enviar señales al proceso y consigo una salida como
Trapped: INT
Trapped: TERM
Trapped: EXIT
Gracias. Pero no funcionará para mí. Esa función trap_with_arg() se bloqueará hasta que se reciba la señal. Quiero que se muestre el nombre de la señal cuando se recibe una señal, mientras se ejecuta la secuencia de comandos. En mi caso, no estoy esperando la señal. Cuando llega, necesita ser impreso. –
'trap_with_arg()' no bloquea. Pasa por su entrada, configura los manejadores de trampas y luego regresa. – perelman
Setas lunares, puede parecer que se bloquea porque las trampas no se procesan mientras se ejecutan los comandos en su secuencia de comandos. Si señalizaste tu script mientras estaba en medio de un 'sueño', no ejecutaría tu trampa hasta que el 'sueño 'se completara. No es asincrónico. La trampa captará las señales entre los comandos en tu secuencia de comandos. – Ray