我正在尝试创建一个等待复制作业完成的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不会立即更新?
答案 0 :(得分:0)
为什么要分离一个什么都不做的睡眠命令?如果你想为自己设置一个警报,那就不用这样了。 (你会睡觉,然后杀死-14 $$,但我离题了。)
虽然循环不会循环一段额外的时间;它们只在条件成立时循环。因此,你认为应该是假的条件实际上是正确的。
因为它是分离的,所以在第一次执行测试之前,睡眠可能尚未开始。在进行测试之前,你可以通过睡一秒钟来节省自己的心痛。