¿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 --parentinvocatest.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?

Respuestas a la pregunta(4)

Su respuesta a la pregunta