jobs -l命令需要运行两次才能更新?

时间:2016-06-28 17:52:11

标签: ksh jobs

我正在尝试创建一个等待复制作业完成的while循环。要获取正在运行的作业的状态,我正在使用:  工作-l | grep -c“正在运行”

我已将其简化为以下代码。作业完成后,将打印出“成功执行的命令”。我看到的是作业完成,但while循环总是做一个额外的循环。

#!/usr/bin/ksh
execCmd()
{
    $*
    if [ $? -ne 0 ]
    then
        exit
    else
        echo  "successfully executed command: \"$*\""
    fi
}

execCmd "sleep 10"& 

NPROC=`jobs -l | grep -c "Running"`

while [[ $NPROC != "0" ]]; do
   echo "$NPROC copy script is still working..."
   sleep 2
   NPROC=`jobs -l | grep -c "Running"`
   echo $NPROC
done

我找到解决此问题的唯一方法是运行jobs -l命令两次,例如:

jobs -l
NPROC=`jobs -l | grep -c "Running"`

当我的execCmd函数完成时,为什么作业-l不会立即更新?

1 个答案:

答案 0 :(得分:0)

为什么要分离一个什么都不做的睡眠命令?如果你想为自己设置一个警报,那就不用这样了。 (你会睡觉,然后杀死-14 $$,但我离题了。)

虽然循环不会循环一段额外的时间;它们只在条件成立时循环。因此,你认为应该是假的条件实际上是正确的。

因为它是分离的,所以在第一次执行测试之前,睡眠可能尚未开始。在进行测试之前,你可以通过睡一秒钟来节省自己的心痛。