web-dev-qa-db-ja.com

xargsを使用してプログラムを並行して実行する

現在、現在のスクリプトがあります。

#!/bin/bash
# script.sh

for i in {0..99}; do
   script-to-run.sh input/ output/ $i
done

Xargsを使用して並行して実行したいと思います。私が試してみました

script.sh | xargs -P8

ただし、上記の操作は一度に1回しか実行されませんでした。 -n8でも運がありません。スクリプトforループで実行される行の最後に&を追加すると、スクリプトを一度に99回実行しようとします。ループを一度に8つだけ、合計100まで実行する方法を教えてください。

62
Olivier

xargs manページから:

このマニュアルページには、xargsのGNUバージョンが記載されています。 xargsは、ブランク(二重引用符または単一引用符またはバックスラッシュで保護可能)または改行で区切られた標準入力から項目を読み取り、コマンド(デフォルトは/ bin/echo)を1回以上実行します。標準入力から読み取られたアイテムごと。標準入力の空白行は無視されます。

つまり、あなたの例ではxargsが待機し、スクリプトからすべての出力を収集してからecho <that output>を実行しています。それほど便利でも、望んでいたものでもありません。

-n引数は、実行される各コマンドで使用する入力からのアイテム数です(ここでは、並列処理については何もしません)。

xargsで必要なことを行うには、次のような(テストされていない)何かをする必要があります。

printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/

これは次のように分類されます。

  • printf %s\\n {0..99}-0から99まで1行に1つの数値を出力します。
  • xargs を実行します
    • 最大実行コマンドラインごとに1つの引数を取る
    • 最大一度に8プロセスを実行
92
Etan Reisner

GNU Parallelを使用すると、次のようになります。

parallel script-to-run.sh input/ output/ {} ::: {0..99}

CPUコアごとに1つのジョブを実行したいnotする場合は、-P8を追加します。

xargsの反対側は、入力にスペース、 '、または "が含まれている場合でも、正しいことを実行します(ただし、ここではそうではありません)。 2つの異なるジョブから半分の行を取得しないことが保証されている出力を使用します。

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

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

Simple scheduling

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

GNU Parallel scheduling

インストール

GNU Parallelがディストリビューション用にパッケージ化されていない場合は、ルートアクセスを必要としないパーソナルインストールを実行できます。これを行うことにより、10秒で実行できます。

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

他のインストールオプションについては、 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

54
Ole Tange