Ihr killBefehl 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 -INTals eine Option und sendet SIGINTan 0( 0ist 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 SIGTERMstandardmäß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 SIGTERMan -INT, die einen Syntaxfehler verursachen würde, aber es sendet SIGTERMan 0ersten und wird nie so weit.)
Also Ihr Haupt - Skript ein bekommt , SIGTERMbevor es wird die laufen waitund 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 ( process1usw.) SIGINTstandardmäßig ignoriert .
In jedem Fall halte ich das Senden SIGTERMfür sinnvoller.
Schließlich bin ich mir nicht sicher, ob kill -process groupes 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