私はこの答えを見ていますここそして、プロセスの実行を待つ間 (私の場合は複数のプロセスの実行) に進行状況バーを実装したいと思います。
私は次のスニペットを使用して、大規模なファイルシステムの複数のコピーを並列に実行しています。
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 "$!"