Ben arka plan işlemleri olarak sonsuz komutları çalışan bir bash:bash kapatma kancası; Ana süreç öldürülünce veya tüm arka plan işlemlerini kapatma
#!/bin/bash
function xyz() {
# some awk command
}
endlesscommand "param 1" | xyz & # async
pids=$!
endlesscommand "param 2" | xyz & # async
pids="$pids "$!
endlesscommand "param 3" | xyz # sync so the script doesn't leave
bu senaryoyu durdurmanın tek yoludur (olmalıdır) Ctrl-C veya öldürmek ve Bu olduğunda, $ pids değişkeninde listelenen tüm arka plan süreçlerini öldürmem gerekiyor. Bunu nasıl yaparım?
o, ben böyle bir şey yapsın anacı üzerine öldürmek sinyalini yakalamak ve bu olduğunda (kapatma kanca) bir işlevi yürütmek mümkün olsaydı:
for $pid in $pids; do kill $pid; done;
Ama bulamıyorum nasıl bunu yapmak ...
ÇÖZÜM aşağıdaki yayınlardan:
#!/bin/bash
function xyz() {
# some awk command
}
trap 'jobs -p | xargs kill' EXIT # part of the solution
endlesscommand "param 1" | xyz & # async
endlesscommand "param 2" | xyz & # async
endlesscommand "param 3" | xyz & # don't sync, but wait:
# other part of the solution:
while pgrep -P "$BASHPID" > /dev/null; do
wait
done
Tuzakları kullanmanız gerekir ... – devnull
Çocuk süreçlerinin açık bir listesini tutmaya gerek yok; Çalışmakta olan çocukların işlem kimliklerini almak için 'iş -p' diyebilirsiniz. – chepner