Jak skrypt bash może zrobić odpowiednik Ctrl-C do zadania w tle?

Czy jest jakiś sposób na wywołanie podprocesu, tak aby on i wszyscy jego potomkowie otrzymali przerwanie, tak jak w przypadku Ctrl-C zadania na pierwszym planie? Próbuję zabić skrypt uruchamiający, który wywołuje długo działające dziecko. Próbowałemkill -SIGINT $child (który nie wysyła przerwania do jego potomków, więc jest to no-op) ikill -SIGINT -$child (który działa, gdy jest wywoływany interaktywnie, ale nie podczas uruchamiania w skrypcie).

Oto skrypt testowy. Długo działający skrypt totest.sh --child. Kiedy zadzwonisztest.sh --parent, przywołujetest.sh --child & a następnie próbuje go zabić. Jak mogę sprawić, by rodzic zabił dziecko z powodzeniem?

#!/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

Wiem, że możesz zmodyfikować długo działające dzieckotrap sygnały, wyślij je do swojego podprocesu, a następnie poczekaj (odSkrypt Bash zabija tło (wielkie) dzieci w Ctrl + C), ale czy jest jakiś sposób bez modyfikowania skryptu potomnego?

questionAnswers(4)

yourAnswerToTheQuestion