lo haría hacer algo como esto:
#!/bin/bash
trap : SIGTERM SIGINT
echo $$
find/>/dev/null 2>&1 &
FIND_PID=$!
wait $FIND_PID
if [[ $? -gt 128 ]]
then
kill $FIND_PID
fi
Alguna explicación está en orden, supongo. Fuera de la puerta, tenemos que cambiar parte del manejo de señal predeterminado. :
es un comando que no funciona, ya que pasar una cadena vacía hace que el shell ignore la señal en lugar de hacer algo al respecto (lo contrario de lo que queremos hacer).
A continuación, el comando find
se ejecuta en segundo plano (desde la perspectiva del guión) y lo llamamos la orden interna wait
a que termine. Dado que le dimos un comando real al trap
anterior, cuando se maneja una señal, wait
saldrá con un estado mayor que 128. Si el proceso wait
ed se completa, wait
devolverá el estado de salida de ese proceso.
Por último, si el wait
devuelve ese estado de error, queremos kill
el proceso secundario. Afortunadamente guardamos su PID. La ventaja de este enfoque es que puede registrar algún mensaje de error o identificar de otra manera que una señal provocó que la secuencia de comandos salga.
Como han mencionado otros, poner kill -- -$$
como argumento en trap
es otra opción si no le importa dejar información después de la salida.
Para trap
para trabajar de la manera deseada, sí es necesario para sincronizarlo con wait
- la página bash
hombre dice "Si bash
está esperando una orden para completar y recibe una señal para la que un trap
se ha establecido, el trap
no se ejecutará hasta que el comando finalice ". wait
es la forma de evitar este inconveniente.
Puede ampliarlo a más procesos secundarios si así lo desea. Realmente no probé esta exhaustivamente, pero parece funcionar aquí.
$ ./test-k.sh &
[1] 12810
12810
$ kill 12810
$ ps -ef | grep find
$
El comando no-op convencional es "': '". – ephemient
Caliente. Cambiándolo ahora –
Si ejecuto el proceso en segundo plano, no se destruye. Si no lo ejecuto en segundo plano, el proceso hijo engendrado se destruye –