
&
20以上のサブプロセス(バックグラウンドで開始された機能)を起動するbashスクリプトがあり、すでに実行されているサブプロセスの数をユーザーに知らせる進行状況インジケータを含めたいと思います。
問題は、これらのサブプロセスを開始するのにかなり長い時間がかかることです(ネットワークによっては約20秒)。正常に開始された子プロセスの数を計算する方法はありますか?
bash 関数に任意のコードを置くことができ、子プロセスが準備されると関数が実行されます。しかし、準備されたタスクの数を含むグローバル変数を増やす良い方法がわかりません。
答え1
外部ファイルをグローバル変数として使用できます。ここに例があります。
file="$(mktemp)"
f() { sleep 3; echo x; sleep 3; }
for i in {1..10} ; do
>>"$file" f &
done
switch=true
while $switch; do
sleep 1
cnt=$(wc -l "$file")
cnt="${cnt%%${file}}" #this is needed to remove the file name
#from the output of wc -l
echo "$cnt"
[ "$cnt" -ge 5 ] && switch=false
done
rm "$file"
保存しexample
て調達すると、以下が提供されます。
$ . example
0
0
10
アクセス権を取得したら
cnt=$(wc -l "$file")
cnt="${cnt%%${file}}"
このコードを進行状況バーに変更するのは簡単です。
[ "$cnt" -ge 5 ] && switch=false
状況に合わせて永久サイクルブレーカーを調整することを忘れないでください。