Gibt es eine Möglichkeit, einen Unterprozess aufzurufen, so dass es und alle seine Nachkommen einen Interrupt gesendet werden, so als ob Sie eine Vordergrundaufgabe Strg-C? Ich versuche, ein Startprogramm zu beenden, das ein lang laufendes Kind aufruft. Ich habe versucht, kill -SIGINT $child
(die den Interrupt nicht an seine Nachkommen sendet so ist ein No-Op) und kill -SIGINT -$child
(die funktioniert, wenn interaktiv aufgerufen, aber nicht bei der Ausführung in einem Skript).Wie kann bash script das Äquivalent von Ctrl-C zu einer Hintergrundaufgabe machen?
Hier ist ein Testskript. Das Skript mit langer Laufzeit ist test.sh --child
. Wenn Sie test.sh --parent
aufrufen, ruft es test.sh --child &
auf und versucht dann, es zu beenden. Wie kann ich den Eltern das Kind erfolgreich töten lassen?
#!/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
Ich weiß, dass Sie das lang laufende Kind trap
Signale modifizieren, um sie zu seinen subprocess senden, und warten Sie dann (von Bash script kill background (grand)children on Ctrl+C), aber ist es eine Möglichkeit, das Kind Skript ohne Änderung?
Aktualisierte Antwort. – user000001