Emriniz killgeriye 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üğü -INTbir seçenek olarak ve gönderir SIGINTiçin 0( 0cari işlem grubundaki tüm süreçleri anlam özel bir sayı).
Ama yazarsan
kill 0 -INT
görür, 0başka seçenek kalmayacağına karar verir, bu nedenle SIGTERMvarsayı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 SIGTERMiçin -INTbir sözdizimi hatası neden olur ki, ama gönderir SIGTERMiçin 0ilk ve çok olduğunu geçmez.)
Demek ana senaryonuz ve ' SIGTERMyi çalıştırmadan önce oluyor .waitecho 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.) SIGINTVarsayılan olarak görmezden gelecektir .
Her durumda, göndermenin SIGTERMdaha 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