GNUパラレル:一部のファイルが利用可能になったときに実行し、残りは待ちます。

GNUパラレル:一部のファイルが利用可能になったときに実行し、残りは待ちます。

ランダムな間隔で事前定義された数のファイルを生成する次のプロセスがあります。

#!/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

見ているhttps://www.gnu.org/software/parallel/parallel_examples.html#example-gnu-parallel-as-queue-system-batch-manager

ターミナル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 -lwc -l

forループは少なくとも20秒間休止状態なので、私は20秒の休止時間を使用しました。必要に応じて節電時間を調整してください。 - ファイル作成に時間がかかる場合は、節電時間を増やしてみてください。本当に早ければ減らしてください。

関連情報