ランダムな間隔で事前定義された数のファイルを生成する次のプロセスがあります。
#!/bin/bash
for i in {1..10}
do
sleep $(shuf -i 20-60 -n 1)
echo $i > file_$i.txt
done
次のように、GNU Parallelを使用して各ファイルで独立して実行される別のプロセスがあります。
parallel wc -l ::: file_{1..10}.txt
予想通り、並列処理は現在利用可能なファイルで実行されます。残りのファイルが利用可能になるまで並列に待機し、できるだけ早く実行する方法はありますか?
答え1
ターミナル1:
true >jobqueue; tail -n+0 -f jobqueue | parallel -u
(-u
このオプションは画面にすぐに出力したい場合は必須です。そうしないと、次のジョブが完了するまで出力が遅れます。どちらの場合も、ジョブはすぐに実行されます。)
NO2。ターミナル:
#!/bin/bash
for i in {1..10}
do
sleep $(shuf -i 20-60 -n 1)
echo $i > file_$i.txt
echo file_$i.txt >> jobqueue
done
このファイルがmy_dirで生成された唯一のファイルであることを確認してください。https://www.gnu.org/software/parallel/parallel_examples.html#example-gnu-parallel-as-dir-processor
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir |
parallel -u echo
これにより、jobqueue
ファイルは必要ありません。
答え2
ファイルが常に1から10まで順番に生成されるかどうかをテストします。file_10.txt
例えば
until [ -e file_10.txt ] ; do sleep 20 ; done
parallel wc -l ::: file_{1..10}.txt
それ以外の場合は、一致するファイルの数を数えることができます。
numfiles=$(find . -name 'file*.txt' | wc -l)
while [ "$numfiles" -lt 10 ] ; do
sleep 20
numfiles=$(find . -name 'file*.txt' | wc -l)
done
parallel wc -l ::: file_{1..10}.txt
(注:ファイル名に改行文字が含まれていると、行数が計算されるためfind
パイプは機能しません。)wc -l
wc -l
for
ループは少なくとも20秒間休止状態なので、私は20秒の休止時間を使用しました。必要に応じて節電時間を調整してください。 - ファイル作成に時間がかかる場合は、節電時間を増やしてみてください。本当に早ければ減らしてください。