killคำสั่งของคุณย้อนกลับ
เช่นเดียวกับคำสั่ง UNIX หลายตัวเลือกที่ขึ้นต้นด้วยเครื่องหมายลบจะต้องมาก่อนก่อนอาร์กิวเมนต์อื่น
ถ้าคุณเขียน
kill -INT 0
มันเห็น-INTเป็นตัวเลือกและส่งSIGINTไปยัง0( 0เป็นหมายเลขพิเศษหมายถึงกระบวนการทั้งหมดในกลุ่มกระบวนการปัจจุบัน)
แต่ถ้าคุณเขียน
kill 0 -INT
มันเห็น0, ตัดสินใจว่าไม่มีตัวเลือกเพิ่มเติมดังนั้นจึงใช้งานSIGTERMตามค่าเริ่มต้น และส่งที่ไปกลุ่มกระบวนการปัจจุบันเช่นเดียวกับถ้าคุณทำ
kill -TERM 0 -INT
(มันจะลองส่งSIGTERMไป-INTซึ่งจะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ แต่จะส่งSIGTERMไปที่0ก่อนและไม่เคยไปไกลขนาดนั้น)
ดังนั้นสคริปต์หลักของคุณจะได้รับSIGTERMก่อนที่จะได้รับการเรียกใช้และwaitecho DONE
เพิ่ม
trap 'echo got SIGTERM' TERM
ที่ด้านบนหลังจาก
trap 'killall' INT
และเรียกใช้อีกครั้งเพื่อพิสูจน์สิ่งนี้
เมื่อ Stephane Chazelas ชี้เด็กที่มีพื้นหลัง ( process1ฯลฯ ) ของคุณจะไม่สนใจSIGINTตามค่าเริ่มต้น
ไม่ว่าในกรณีใดฉันคิดว่าการส่งข้อความSIGTERMจะสมเหตุสมผลมากกว่า
ในที่สุดฉันไม่แน่ใจว่าkill -process groupจะรับประกันการไปหาลูกก่อนหรือไม่ การละเว้นสัญญาณในขณะที่ปิดเครื่องอาจเป็นความคิดที่ดี
ลองทำสิ่งนี้:
#!/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