2016-06-28 37 views
1

我正在尝试创建一个等待复制作业完成的while循环。要获得正在运行的作业的状态,我正在使用: 作业-l | grep -c“正在运行”作业-l命令需要运行两次才能更新?

我已将其简化为以下代码。作业完成后,将打印出“成功执行的命令”。我看到的是工作完成,但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命令,e.g:

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

为什么工作-l没有得到直接离开,当我execCmd函数完成更新?

回答

0

为什么要分离一个什么也不做的睡眠命令?如果你想为自己设置闹钟,那不是做到这一点的方法。 (你会睡觉,然后杀死-14 $$,但我离题了。)

虽然循环不循环额外的时间;它们只在条件成立时才会循环。因此,你觉得应该是错误的条件,事实上是正确的。

因为它是分离的,睡眠在第一次执行测试之前可能没有开始。睡前一秒钟可以节省自己的心痛。

+0

我意识到这看起来很愚蠢,但我大量简化了脚本。想象一下,睡眠命令是一个真正的过程。我将它分开的原因是因为最终目标是同时运行一些这些命令。 – gmate2008

+0

我不会延迟十秒,然后假设它已经工作。总的来说,它会留在while循环中,直到所有的工作都完成了,即使它们花的时间比预期的要长。如果你真的运行上面的代码,你会看到命令完成(当它打印出“成功执行的命令:”,然后while循环将打印出一个额外的“复制脚本仍在工作...”。 – gmate2008

相关问题