kill
Perintah Anda mundur.
Seperti banyak perintah UNIX, opsi yang dimulai dengan minus harus didahulukan, sebelum argumen lain.
Jika kamu menulis
kill -INT 0
ia melihat -INT
opsi, dan mengirim SIGINT
ke 0
( 0
adalah 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 SIGTERM
secara default. Dan mengirimkan bahwa untuk kelompok proses saat ini, sama seperti jika Anda lakukan
kill -TERM 0 -INT
(Ini juga akan mencoba mengirim SIGTERM
ke -INT
, yang akan menyebabkan kesalahan sintaks, tetapi mengirim SIGTERM
ke 0
pertama, dan tidak pernah sampai sejauh itu.)
Jadi skrip utama Anda adalah SIGTERM
sebelum menjalankan wait
dan 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 SIGINT
secara default.
Bagaimanapun, saya pikir pengiriman SIGTERM
akan lebih masuk akal.
Akhirnya, saya tidak yakin apakah kill -process group
dijamin 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