为什么最后一个后台作业在 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

它没有回答你的问题,只是提示:

当您在循环中单独执行作业时。 它按预期工作/计数。

但是现在还没有胶水。

相关内容