마지막 백그라운드 작업이 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

힌트와 마찬가지로 귀하의 질문에 대답하지 않습니다.

루프에서 작업을 별도로 실행할 때. 예상대로 작동/계산됩니다.

하지만 지금은 왜 그런지 알 수 없습니다.

관련 정보