Ich würde etwa so vorgehen:
#!/bin/bash
trap : SIGTERM SIGINT
echo $$
find / >/dev/null 2>&1 &
FIND_PID=$!
wait $FIND_PID
if [[ $? -gt 128 ]]
then
kill $FIND_PID
fi
Ich denke, eine Erklärung ist angebracht. Zunächst müssen wir einige der Standard-Signalverarbeitung ändern. :
ist ein No-op-Befehl, da die Übergabe einer leeren Zeichenkette die Shell veranlasst, das Signal zu ignorieren, anstatt etwas dagegen zu unternehmen (das Gegenteil von dem, was wir tun wollen).
Dann wird die find
wird im Hintergrund ausgeführt (aus Sicht des Skripts) und wir rufen die wait
eingebaut, um es zu beenden. Da wir einen echten Befehl an trap
oben, wenn ein Signal behandelt wird, wait
wird mit einem Status größer als 128 beendet. Wenn der Prozess wait
für vervollständigt, wait
gibt den Exit-Status des Prozesses zurück.
Zuletzt, wenn die wait
diesen Fehlerstatus zurückgibt, wollen wir kill
den Kindprozess. Glücklicherweise haben wir seine PID gespeichert. Der Vorteil dieses Ansatzes ist, dass Sie eine Fehlermeldung protokollieren oder auf andere Weise feststellen können, dass ein Signal das Skript beendet hat.
Wie andere bereits erwähnt haben, ist die kill -- -$$
als Ihr Argument für trap
ist eine weitere Option, wenn Sie keine Informationen nach dem Verlassen der Website hinterlassen wollen.
Pour trap
so zu funktionieren, wie Sie es wünschen, müssen Sie es mit wait
- die bash
Manpage sagt: "Wenn bash
auf die Fertigstellung eines Befehls wartet und ein Signal empfängt, für das ein trap
gesetzt wurde, wird die trap
wird nicht ausgeführt, bis der Befehl abgeschlossen ist." wait
ist der Weg, dieses Problem zu umgehen.
Sie können diese Funktion auch auf weitere untergeordnete Prozesse ausdehnen, wenn Sie dies wünschen. Ich habe das nicht wirklich ausgiebig getestet, aber es scheint hier zu funktionieren.
$ ./test-k.sh &
[1] 12810
12810
$ kill 12810
$ ps -ef | grep find
$