2009-10-06 15 views
6

Teniendo en cuenta este programa hack.c:bash trap of TERM - ¿Qué estoy haciendo mal?

#include <stdio.h> 
main() 
{ 
int i=0; 
for(i=0; i<100; i++) { 
    printf("%d\n", i); 
    sleep(5); 
} 
} 

y esta escritura del golpe hack.sh:

#!/bin/bash 
./hack 

Si me quedo hack.sh, dos procesos se crean - uno para bash, uno para el Tarea C Si se envía una señal TERM al proceso bash, el proceso C queda ileso.

Supongamos que el bash original se inició desde un programa Java utilizando Runtime.exec(), por lo que el único control que tengo sobre él es Process.destroy() (¿qué envía TERM al proceso bash)? Supongamos que yo quiero el proceso C para morir junto con el bash que lo lanzó?

He estado tratando de cosas como esta en bash:

#!/bin/bash 
trap "kill -TERM -$$; exit" TERM 
./hack 

es decir, una cláusula trampa que atrapa la señal TERM y vuelve a difundir a todo el grupo de procesos. Esto no funciona para mí: un proceso bash con esa cláusula trap en él ignora señales TERM.

¿Qué me falta aquí?

+1

La página man de bash dice: Si bash está esperando que se complete un comando y recibe una señal para la cual se ha establecido una trampa, la trampa no se ejecutará hasta que el comando finalice. – tangens

+0

¿Ha intentado usar 'exec' en lugar de mantener vivo el proceso de shell? –

+0

Tienes razón, tangens. Mi única excusa es que el texto está en la sección SEÑALES, muy por encima de la documentación de la trampa. ¡Gracias! –

Respuesta

10

Usted puede tratar de algo en este sentido:

#!/bin/bash 
./hack & 
pid=$! 
trap "kill $pid" TERM 
wait $pid 

Podría ser más simple (y equivalente) para hacer esto:

#!/bin/bash 
./hack & 
trap "kill $!" TERM 
wait 

Las comillas dobles en la trampa debe hacer ampliación de palabras suceda cuando se define la trampa, ¡entonces un valor cambiante de $! no debería tener un impacto; pero me gusta la primera versión mejor.

+0

Esto funciona, aunque podría pensar que no es así debido a lo que dijeron los tangentes en los comentarios sobre la pregunta. PERO el párrafo completo, qouted parcialmente por tangens, dice: – hopla

+0

Si bash está esperando que se complete un comando y recibe una señal para la cual se ha establecido una trampa, la trampa no se ejecutará hasta que el comando finalice. Cuando bash está esperando un comando asincrónico a través de la espera interna, la recepción de una señal para la cual se ha establecido una trampa provocará que la espera interna vuelva inmediatamente con un estado de salida mayor que 128, inmediatamente después de que se ejecute la trampa. – hopla

+0

También quiere agregar que puede matar a todo el grupo de procesos (el proceso en sí y sus hijos) haciendo: kill -TERM - $$ – hopla

Cuestiones relacionadas