web-dev-qa-db-ja.com

bashスクリプトの並列処理

N個のステートメントs1、s2、s3、...、snについて考えてみましょう。各ステートメントには無限の実行ステップがあり、すべてを並行して実行したいと思います。

私のシェルスクリプトは次のようになります

s1 
s2 
s3
.
.
.
sn

インターリーブが発生するようにコードを変更するにはどうすればよいですか?

3
hanugm

各ステートメントをバックグラウンドで実行するように要求すると、期待どおりの結果が得られるようです。

s1 &
s2 &
...
sn &
wait

waitコマンドは、すべてのバックグラウンドタスクが完了するまで、スクリプトをフォアグラウンドで実行します。)

さらに制御が必要な場合は、GNU parallelの使用を検討してください。

5
dhag

GNUParallelはそのために作られています:

cat file_with_commands | parallel

デフォルトでは、CPUコアごとに1つのジョブが使用されます。コア以上のものが必要な場合:

parallel -j200 < file_with_commands

コマンドが非常に似ている場合:

parallel s{} ::: {1..100}

実行されますs1s2 ... s100 並行して。

GNU Parallelは一般的な並列処理機能であり、同じマシン上またはsshアクセスできる複数のマシン上でジョブを簡単に並列実行できます。

4つのCPUで実行する32の異なるジョブがある場合、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。

Simple scheduling

代わりに、GNU Parallelは、終了時に新しいプロセスを生成します。つまり、CPUをアクティブに保ち、時間を節約します。

GNU Parallel scheduling

インストール

セキュリティ上の理由から、パッケージマネージャとGNU Parallelをインストールする必要がありますが、GNU Parallelがディストリビューションにパッケージ化されていない場合は、個人用インストールを実行できます。ルートアクセスは必要ありません。次のようにすることで、10秒で実行できます。

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

その他のインストールオプションについては、 http://git.savannah.gnu.org/cgit/parallel.git/tree/README を参照してください。

詳細

その他の例を参照してください: http://www.gnu.org/software/parallel/man.html

イントロビデオを見る: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

チュートリアルをウォークスルーします: http://www.gnu.org/software/parallel/parallel_tutorial.html

サポートを受けるには、メーリングリストにサインアップしてください: https://lists.gnu.org/mailman/listinfo/parallel

3
Ole Tange