シェルスクリプト:N個のコマンドのバッチを並行して実行し、すべてが完了するのを待ち、次のN個を実行


9

タスク:3〜5個のコマンドで構成されるブロックを実行します(並列/バックグラウンド)。ブロックの例:

dd if=/dev/urandom of=/mnt/1/x bs=1024 count=1024000000 &
dd if=/dev/urandom of=/mnt/2/x bs=1024 count=1024000000 &
dd if=/dev/urandom of=/mnt/3/x bs=1024 count=1024000000 &

完了すると、次のブロックが実行されます。私は、これはロックファイルを介して行うことができると思います:

task1.sh:

real_task1 real_param1 ; rm /var/lock/myscript/task1.lock

task2.sh:

real_task2 real_param1 ; rm /var/lock/myscript/task2.lock

...

taskgen.sh:

# loop
 # while directory isn't empty - wait...
 gen_tasks.pl # build task files from some queue
 for i in 1 2 3; do touch /var/lock/myscript/task$i.lock ; done
 ./task1.sh &
 ./task2.sh &
 ./task3.sh &
 # if task1.sh doesn't exits then exit, else loop waits for files to be deleted

ディレクトリが空かどうかを確認するためのいくつかのメソッドがここにあります。どちらを使用するかわかりません。

質問:これを実装するより良い方法はありますか?

PS可能なステータスレポート方法:

 command && report_good_state.sh taskid ;  report_state_done.sh taskid; rm /var/lock/myscript/taskN.lock

みんな、何を言えばいいのかわからない:すべての答えは正しいです、ありがとう!
カガリさん

回答:


8

これはまさにgnu parallelが設計されたものであるため、使用することを強くお勧めします。特に、それをセマフォとして実行すること見てください:

for i in {1..4}
do
  echo running $i
  sem -j3 df dd if=/dev/urandom of=/mnt/$i/x bs=1024 count=1024000000 ";" echo done
done
# sem --wait waits until all jobs are done.
sem --wait

8

おそらくこれにいくつかのバリエーションがありますか?

while true
do
  ./task1.sh&
  pid1=$!
  ./task2.sh&
  pid2=$!
  ./task3.sh&
  pid3=$!
  wait $pid1
  wait $pid2
  wait $pid3
done

しかし、うん、GNU Parallelが利用可能であればもっと良いです。
Eduardo Ivanec 2011


3

「待機」は、すべてのバックグラウンドジョブが完了するまで待機します。サンプル:

30睡眠&40睡眠&120睡眠&待つ

すべてのコマンドが完了するまで、つまりこの例では少なくとも120秒待機します。

お役に立てれば。


0

上記のPhil Hollenbackが説明したように、GNU semユーティリティを使用しようとしましたが、非常に重い(300以上のインスタンスがマシンに障害をもたらした)ことがわかりました。軽量のカウントセマフォを実装するための同様のツールを探しましたが、適切なものが見つかりませんでした。

だから私はflockを使って自分で実装しました、それはセマフォリックと呼ばれています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.