2011-04-13 23 views
12

No puedo capturar una señal cuando se ejecuta en un proceso secundario/en segundo plano.Señal de captura en el proceso de fondo secundario

Aquí es mi simple script bash:

#!/bin/bash 

echo "in child" 

trap "got_signal" SIGINT 

function got_signal { 
    echo "trapped" 
    exit 0 
} 

while [ true ]; do 
    sleep 2 
done 

Cuando se ejecuta este y más tarde hacer

kill -SIGINT (pid) 

todo funciona como se espera, se imprime 'atrapado' y sale.

Ahora, si comienzo a la misma escritura de un guión de los padres de esta manera:

#!/bin/bash 

echo "starting the child" 

./child.sh & 

Entonces el niño no atrapa la señal más ....?

Después de cambiar para usar SIGTERM en lugar de SIGINT, parece estar funcionando correctamente ...?

Respuesta

10

El bash página de manual en OSX (pero debe ser la misma en otras versiones) tiene esto que decir sobre el manejo de señales:

comandos

no incorporadas a cargo de bash tienen los gestores de señales configuradas con los valores heredados por el caparazón de su padre. Cuando el control del trabajo no está en el efecto , los comandos asincrónicos ignoran SIGINT y SIGQUIT además de estos controladores heredados.

y más adelante, bajo el mando trap:

Signals ignorados en la entrada a la carcasa no se puede atrapar o RESET.

Como las secuencias de comandos no usan el control de trabajo de forma predeterminada, esto significa que está hablando del caso.

3

por su nota:

Signals ignored upon entry to the shell cannot be trapped or reset. 

he notado que ZSH no ignora las señales enviadas de ida y vuelta entre el padre y el proceso hijo, pero lo hace bash. Aquí está la pregunta que me puse:

Trapping CHLD signal - ZSH works but ksh/bash/sh don't?

Cuestiones relacionadas