為什麼最後一個後台作業在 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

它沒有回答你的問題,就像提示一樣:

當您在循環中單獨執行作業時。它按預期工作/計數。

但現在還沒有膠水,為什麼。

相關內容