Почему последнее фоновое задание зависает в bash?

Почему последнее фоновое задание зависает в bash?

Вот скрипт, написанный для bash:

#!/bin/bash
sleep 1 &
sleep 2 &
sleep 3 &
for t in {10..0}
do
#   jobs
    echo "Waiting("$t")..."
    JCNT=`jobs | wc -l`
    echo "JCNT="$JCNT
    if [ $JCNT -eq 0 ]; then
        break
    fi
    sleep 1
done
exit 0

Работает 10 секунд, а не 3 секунды, как ожидалось. Но если раскомментировать команду "jobs", то работает нормально. Понятия не имею, почему. Можете мне помочь?

Вывод скрипта с комментарием «jobs»:

Waiting(10)...
JCNT=3
Waiting(9)...
JCNT=2
Waiting(8)...
JCNT=1
Waiting(7)...
JCNT=1
Waiting(6)...
JCNT=1
Waiting(5)...
JCNT=1
Waiting(4)...
JCNT=1
Waiting(3)...
JCNT=1
Waiting(2)...
JCNT=1
Waiting(1)...
JCNT=1
Waiting(0)...
JCNT=1

И с незакомментированной командой "jobs":

[1]   Running                 sleep 1 &
[2]-  Running                 sleep 2 &
[3]+  Running                 sleep 3 &
Waiting(10)...
JCNT=3
[1]   Done                    sleep 1
[2]-  Running                 sleep 2 &
[3]+  Running                 sleep 3 &
Waiting(9)...
JCNT=2
[2]-  Done                    sleep 2
[3]+  Running                 sleep 3 &
Waiting(8)...
JCNT=1
[3]+  Done                    sleep 3
Waiting(7)...
JCNT=0

ДОБАВЛЕН

Я изменил скрипт следующим образом:

#!/bin/bash
sleep 1 &
sleep 2 &
sleep 3 &
for t in {10..0}
do
    KKK=`jobs`
    echo $KKK
    echo "Waiting("$t")..."
    JCNT=`jobs | wc -l`
    echo "JCNT="$JCNT
    if [ $JCNT -eq 0 ]; then
        break
    fi
    sleep 1
done
exit 0

...и обнаружил, что есть информация о последней выполненной работе:

[3] Done sleep 3

Вызов "jobs" просто очищает список выполненных заданий. Выполнение "jobs|wc -l" — неправильный способ подсчета активных заданий. Правильный способ — "jobs -r|wc -l".

решение1

Это не ответ на ваш вопрос, а просто намек:

когда вы выполняете задание отдельно в цикле. Это работает / считается, как и ожидалось.

Но пока у меня нет клея.

Связанный контент