当我们等待进程返回时显示进度条

当我们等待进程返回时显示进度条

我正在看这个答案这里我想在等待进程运行时实现进度条 - 或者在我的情况下 - 很多。

我使用以下代码片段并行运行大型文件系统的多个副本

for svol in "${svols[@]}";
do
    syslog_info "copying $svol"
    ${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."
wait

我希望添加进度条以在等待后台进程返回时显示。

这是我的尝试,谁能告诉我哪里出错了或者帮助我让它工作?

for svol in "${svols[@]}";
do
    syslog_info "copying $svol"
    ${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."

i=1
sp="/-\|"
echo -n ' '

until wait;
do
    printf "\b${sp:i++%${#sp}:1}"
    sleep 0.1
done

编辑:我已将这个问题中的原始代码更新为经过测试的工作解决方案 - 仍在尝试让它运行直到等待返回

另一方面,顶部的原始代码可以正常工作,并且以下代码片段也可以作为独立的代码片段使用

i=1
sp="/-\|"
echo -n ' '

for i in {1..100};
do
    printf "\b${sp:i++%${#sp}:1}"
    sleep 0.1
done

答案1

wait阻塞直到所有后台作业返回,因此您不能将其用作条件,until因为它只会运行一次。

您可以使用[ -n "$(jobs)" ]以下命令来查看是否有作业正在运行:

while [ -n "$(jobs)" ]; do
  printf "\b${sp:i++%${#sp}:1}"
  sleep 0.1
done

答案2

在 GNU/Linux 上,您可以使用Coreutils 进度查看器( progress,以前称为cv)

"${CP}" -p -- "$svol" "$somedir" & progress -mp "$!"

相关内容