kill
คำสั่งของคุณย้อนกลับ
เช่นเดียวกับคำสั่ง UNIX หลายตัวเลือกที่ขึ้นต้นด้วยเครื่องหมายลบจะต้องมาก่อนก่อนอาร์กิวเมนต์อื่น
ถ้าคุณเขียน
kill -INT 0
มันเห็น-INT
เป็นตัวเลือกและส่งSIGINT
ไปยัง0
( 0
เป็นหมายเลขพิเศษหมายถึงกระบวนการทั้งหมดในกลุ่มกระบวนการปัจจุบัน)
แต่ถ้าคุณเขียน
kill 0 -INT
มันเห็น0
, ตัดสินใจว่าไม่มีตัวเลือกเพิ่มเติมดังนั้นจึงใช้งานSIGTERM
ตามค่าเริ่มต้น และส่งที่ไปกลุ่มกระบวนการปัจจุบันเช่นเดียวกับถ้าคุณทำ
kill -TERM 0 -INT
(มันจะลองส่งSIGTERM
ไป-INT
ซึ่งจะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ แต่จะส่งSIGTERM
ไปที่0
ก่อนและไม่เคยไปไกลขนาดนั้น)
ดังนั้นสคริปต์หลักของคุณจะได้รับSIGTERM
ก่อนที่จะได้รับการเรียกใช้และwait
echo 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