¿Cómo puede bash script hacer el equivalente de Ctrl-C a una tarea en segundo plano?
¿Hay alguna forma de invocar un subproceso para que a él y a todos sus descendientes se les envíe una interrupción, como si presionara Ctrl-C una tarea de primer plano? Estoy intentando matar un script de inicio que invoca a un niño de larga duración. He intentadokill -SIGINT $child
(que no envía la interrupción a sus descendientes, por lo que es un no-op) ykill -SIGINT -$child
(que funciona cuando se invoca de manera interactiva pero no cuando se ejecuta en un script).
Aquí hay un guión de prueba. El script de larga duración estest.sh --child
. Cuando usted llamatest.sh --parent
invocatest.sh --child &
Y luego trata de matarlo. ¿Cómo puedo hacer que el padre mate al niño con éxito?
#!/bin/bash
if [ "$1" = "--child" ]; then
sleep 1000
elif [ "$1" = "--parent" ]; then
"$0" --child &
for child in $(jobs -p); do
echo kill -SIGINT "-$child" && kill -SIGINT "-$child"
done
wait $(jobs -p)
else
echo "Must be invoked with --child or --parent."
fi
Sé que puedes modificar el niño de larga duración paratrap
señales, enviarlas a su subproceso, y luego esperar (desdeBash script mata a niños de fondo (grandes) en Ctrl + C), pero ¿hay alguna manera sin modificar el script hijo?