Как завершить все подпрограммы?

У меня есть 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, главный процесс завершается, но фоновые циклы продолжают работать. Как мне заставить их всех выйти? Или есть лучший способ породить настраиваемое количество логических циклов, выполняющихся параллельно?

29
задан ykaganovich 2 December 2011 в 22:30
поделиться

2 ответа

Один из способов убить подоболочки, но не себя:

kill $(jobs -p)
4
ответ дан 28 November 2019 в 01:31
поделиться

Вот мое возможное решение. Я отслеживаю идентификаторы процессов подоболочки, используя переменную массива, и ловлю сигнал 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
0
ответ дан 28 November 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: