Ihr kill
Befehl ist rückwärts.
Wie bei vielen UNIX-Befehlen müssen Optionen, die mit einem Minus beginnen, vor anderen Argumenten stehen.
Wenn du schreibst
kill -INT 0
Es sieht das -INT
als eine Option und sendet SIGINT
an 0
( 0
ist eine spezielle Nummer, die alle Prozesse in der aktuellen Prozessgruppe bezeichnet).
Aber wenn du schreibst
kill 0 -INT
Es sieht die 0
, entscheidet, dass es keine weiteren Optionen gibt, also verwendet es SIGTERM
standardmäßig. Und sendet das an die aktuelle Prozessgruppe, genauso wie Sie es getan haben
kill -TERM 0 -INT
(es würde auch versuchen , zu senden SIGTERM
an -INT
, die einen Syntaxfehler verursachen würde, aber es sendet SIGTERM
an 0
ersten und wird nie so weit.)
Also Ihr Haupt - Skript ein bekommt , SIGTERM
bevor es wird die laufen wait
und echo DONE
.
Hinzufügen
trap 'echo got SIGTERM' TERM
an der Spitze gleich danach
trap 'killall' INT
und führen Sie es erneut aus, um dies zu beweisen.
Wie Stephane Chazelas betont, werden Ihre Hintergrundkinder ( process1
usw.) SIGINT
standardmäßig ignoriert .
In jedem Fall halte ich das Senden SIGTERM
für sinnvoller.
Schließlich bin ich mir nicht sicher, ob kill -process group
es garantiert ist, zuerst zu den Kindern zu gehen. Das Ignorieren von Signalen beim Herunterfahren ist möglicherweise eine gute Idee.
Also versuche folgendes:
#!/bin/bash
trap 'killall' INT
killall() {
trap '' INT TERM # ignore INT and TERM while shutting down
echo "**** Shutting down... ****" # added double quotes
kill -TERM 0 # fixed order, send TERM not INT
wait
echo DONE
}
./process1 &
./process2 &
./process3 &
cat # wait forever