作业-l命令需要运行两次才能更新?
问题描述:
我正在尝试创建一个等待复制作业完成的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函数完成更新?
答
为什么要分离一个什么也不做的睡眠命令?如果你想为自己设置闹钟,那不是做到这一点的方法。 (你会睡觉,然后杀死-14 $$,但我离题了。)
虽然循环不循环额外的时间;它们只在条件成立时才会循环。因此,你觉得应该是错误的条件,事实上是正确的。
因为它是分离的,睡眠在第一次执行测试之前可能没有开始。睡前一秒钟可以节省自己的心痛。
我意识到这看起来很愚蠢,但我大量简化了脚本。想象一下,睡眠命令是一个真正的过程。我将它分开的原因是因为最终目标是同时运行一些这些命令。 – gmate2008
我不会延迟十秒,然后假设它已经工作。总的来说,它会留在while循环中,直到所有的工作都完成了,即使它们花的时间比预期的要长。如果你真的运行上面的代码,你会看到命令完成(当它打印出“成功执行的命令:”,然后while循环将打印出一个额外的“复制脚本仍在工作...”。 – gmate2008