Wie kann bash-Skript tun, das äquivalent von Strg-C, um eine hintergrund-Aufgabe?
Gibt es eine Möglichkeit zum aufrufen einer Teilprozess, so dass er und alle seine Nachkommen gesendet werden, einen interrupt aus, als ob Sie Strg-C ein Vordergrund-task? Ich versuche zu töten launcher-Skript aufruft, die eine lang andauernde Kind. Ich habe versucht kill -SIGINT $child
(die nicht senden zu unterbrechen, um Ihre Nachkommen, so ist ein no-op) kill -SIGINT -$child
(was funktioniert, wenn Sie angerufen werden interaktiv, aber nicht, wenn die Ausführung in einem Skript).
Hier ist ein test-Skript. Die lang andauernde Skript ist test.sh --child
. Wenn Sie anrufen test.sh --parent
ruft es test.sh --child &
und dann versucht, ihn zu töten. Wie kann ich die Eltern töten das Kind erfolgreich?
#!/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 ändern können, die lang andauernde Kind trap
- Signale, schicken Sie diese an Ihre Teilprozess, und warten Sie dann (aus
Bash-Skript kill-hintergrund (grand)Kinder auf Strg+C), aber gibt es eine Möglichkeit, ohne änderung der Kind-Skript?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen : So senden Sie ein signal SIGINT von Skript zu Skript ? BASH
Auch von
info bash
So
bash
unterscheidet Prozesse im hintergrund von der Vordergrund-Prozesse, durch die Prozess-Gruppen-ID. Wenn die Prozess-Gruppen-id gleich Prozess-id, dann wird der Prozess ist ein Vordergrund-Prozess, und wird beendet, wenn es erhält eineSIGINT
signal. Sonst wird es nicht kündigen (es sei denn, es ist eingeklemmt).Sehen Sie die Prozess-Gruppen-Id mit
So, wenn Sie ein hintergrund-Prozess (mit
&
) von einem Skript aus, er ignoriert dieSIGINT
signal, es sei denn, es ist gefangen.Jedoch können Sie immer noch töten, wird der Kind-Prozess mit anderen Signalen, wie
SIGKILL
,SIGTERM
usw.Zum Beispiel, wenn Sie ändern Sie Ihr Skript, um die folgenden es wird erfolgreich töten, wird der Kind-Prozess:
Ausgabe:
Für jemand wundert, das ist, wie Sie starten Kinder im hintergrund und tötet Sie auf Strg+c:
kill
würde nur das töten der Prozesse angegeben, in der Argumente und nicht deren Nachkommen.gibt eine pid des Kindes in
$!
Ich würde beginnen mit diesem Modell eher als mit bash-job control (bg, fg, jobs). Normalerweise init erbt und erntet verwaiste Prozesse. Welches problem versuchst du zu lösen?
trap "kill ...." INT
, und nichttrap INT "kill ...."
?Können Sie halten mit
SIGINT
mit hintergrund-tasks mit einem einfachen kleinen twist: Setzen Sie Ihre asynchroner Unterprozess-Aufruf in einer Funktion oder{
}
, und geben Sie essetsid
so hat es seine eigene Prozess-Gruppe.Hier ist dein Drehbuch halten, es ist der ganze erste Absicht:
Verwendung und Vermehrung
SIGINT
und nicht mit einem anderen signaländern nur das aufrufen von:
"$0" --child &
zu{ setsid "$0" --child; } &
code hinzufügen, die notwendig sind, um die PID Ihres Kindes Instanz, das ist der einzige Prozess im hintergrund subshell.
Hier ist dein code:
Hier ist das wichtigste, doc Teil von bash-Handbuch
Prozess-Gruppen-id, die Einfluss auf hintergrund-Prozess (in Job-Control Abschnitt doc):
Standard-handler für
SIGINT
undSIGQUIT
(in Signale Abschnitt doc):und über änderung von fallen (in
trap
builtin doc):