Emriniz kill
geriye doğru.
Birçok UNIX komutunda olduğu gibi, eksi ile başlayan seçeneklerin önce diğer argümanlardan önce gelmesi gerekir.
Eğer yazarsan
kill -INT 0
gördüğü -INT
bir seçenek olarak ve gönderir SIGINT
için 0
( 0
cari işlem grubundaki tüm süreçleri anlam özel bir sayı).
Ama yazarsan
kill 0 -INT
görür, 0
başka seçenek kalmayacağına karar verir, bu nedenle SIGTERM
varsayılan olarak kullanır . Ve bunu , o anki süreç grubuna gönderir , yaptığınız gibi
kill -TERM 0 -INT
(o da göndermeyi denemek istiyorum SIGTERM
için -INT
bir sözdizimi hatası neden olur ki, ama gönderir SIGTERM
için 0
ilk ve çok olduğunu geçmez.)
Demek ana senaryonuz ve ' SIGTERM
yi çalıştırmadan önce oluyor .wait
echo DONE
Eklemek
trap 'echo got SIGTERM' TERM
tepede, hemen sonra
trap 'killall' INT
ve bunu kanıtlamak için tekrar çalıştırın.
Stephane Chazelas'ın işaret ettiği gibi, arka plandaki çocuklarınız ( process1
, vb.) SIGINT
Varsayılan olarak görmezden gelecektir .
Her durumda, göndermenin SIGTERM
daha anlamlı olacağını düşünüyorum .
Son olarak, önce kill -process group
çocuklara gitme garantisi olup olmadığından emin değilim . Kapatma sırasında sinyalleri dikkate almamak iyi bir fikir olabilir.
Öyleyse şunu dene:
#!/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