
다음은 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
힌트와 마찬가지로 귀하의 질문에 대답하지 않습니다.
루프에서 작업을 별도로 실행할 때. 예상대로 작동/계산됩니다.
하지만 지금은 왜 그런지 알 수 없습니다.