/ / bash trap de TERM - ¿Qué estoy haciendo mal? - bash, señales, término, bash-trap

bash trap de TERM - ¿Qué estoy haciendo mal? - bash, señales, término, bash-trap

Dado este programa hack.c:

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

y este script de hack.sh bash:

#!/bin/bash
./hack

Si ejecuto hack.sh, se crean dos procesos: uno para bash, uno para la tarea C. Si se envía una señal TERM al proceso bash, el proceso C queda ileso.

Ahora, 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 querer el proceso C para morir junto con el bash que lo lanzó?

He estado probando cosas como esta en bash:

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

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

¿Que me estoy perdiendo aqui?

Respuestas

10 por respuesta № 1

Puede probar algo en esta línea:

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

Puede ser más simple (y equivalente) hacer esto:

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

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