У меня есть bash-скрипт для тестирования работы сервера под нагрузкой.
num=1
if [ $# -gt 0 ]; then
num=$1
fi
for i in {1 .. $num}; do
(while true; do
{ time curl --silent 'http://localhost'; } 2>&1 | grep real
done) &
done
wait
Когда я нажимаю Ctrl-C, главный процесс завершается, но фоновые циклы продолжают работать. Как мне заставить их всех выйти? Или есть лучший способ породить настраиваемое количество логических циклов, выполняющихся параллельно?
Один из способов убить подоболочки, но не себя:
kill $(jobs -p)
Вот мое возможное решение. Я отслеживаю идентификаторы процессов подоболочки, используя переменную массива, и ловлю сигнал Ctrl-C, чтобы убить их.
declare -a subs #array of subshell pids
function kill_subs() {
for pid in ${subs[@]}; do
kill $pid
done
exit 0
}
num=1 if [ $# -gt 0 ]; then
num=$1 fi
for ((i=0;i < $num; i++)); do
while true; do
{ time curl --silent 'http://localhost'; } 2>&1 | grep real
done &
subs[$i]=$! #grab the pid of the subshell
done
trap kill_subs 1 2 15
wait