killPerintah Anda mundur.
Seperti banyak perintah UNIX, opsi yang dimulai dengan minus harus didahulukan, sebelum argumen lain.
Jika kamu menulis
kill -INT 0
ia melihat -INTopsi, dan mengirim SIGINTke 0( 0adalah nomor khusus yang berarti semua proses dalam grup proses saat ini).
Tetapi jika Anda menulis
kill 0 -INT
ia melihat 0, memutuskan tidak ada lagi opsi, jadi gunakan SIGTERMsecara default. Dan mengirimkan bahwa untuk kelompok proses saat ini, sama seperti jika Anda lakukan
kill -TERM 0 -INT
(Ini juga akan mencoba mengirim SIGTERMke -INT, yang akan menyebabkan kesalahan sintaks, tetapi mengirim SIGTERMke 0pertama, dan tidak pernah sampai sejauh itu.)
Jadi skrip utama Anda adalah SIGTERMsebelum menjalankan waitdan echo DONE.
Menambahkan
trap 'echo got SIGTERM' TERM
di atas, tepat setelah
trap 'killall' INT
dan jalankan lagi untuk membuktikan ini.
Seperti yang ditunjukkan Stephane Chazelas, anak-anak Anda yang berlatar belakang ( process1, dll.) Akan mengabaikannya SIGINTsecara default.
Bagaimanapun, saya pikir pengiriman SIGTERMakan lebih masuk akal.
Akhirnya, saya tidak yakin apakah kill -process groupdijamin pergi ke anak-anak dulu. Mengabaikan sinyal saat mematikan mungkin merupakan ide yang bagus.
Jadi coba ini:
#!/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