2012-02-13 18 views

Respuesta

35

(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 
+0

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. –

+8

'trap_with_arg()' no bloquea. Pasa por su entrada, configura los manejadores de trampas y luego regresa. – perelman

+0

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

6

Dentro la trampa (cuando se dispara a través de una señal), el $? variable se establece inicialmente en el número de señales, más de 128, por lo que puede asignar el número de señal a una variable al hacer la primera declaración de las medidas trampa para algo así como

sig=$(($? - 128)) 

A continuación, puede obtener el nombre de la señal utilizando el comando kill

kill -l $sig 
+1

Eso hubiera sido bueno, pero no funciona para mí en Linux 3.10 con Bash 4.3.30: '$?' Es 0 al comienzo del manejador de señal aunque haya sido invocado por la señal 'TERM '. –

+0

Esta parece ser la mejor respuesta ya que es más sencilla. – codeforester

1

una forma sencilla de hacer esto:

_handler() { 
    signal=$1 
    echo signal was $signal 
} 

trap '_handler SIGTERM' SIGTERM 
trap '_handler SIGINT' SIGINT 
Cuestiones relacionadas