web-dev-qa-db-ja.com

xargsを使用した並列処理

各行に対してbashスクリプトを並行して実行する方法は?実際には、ログファイルに合わせて調整し、見つかった行ごとに、次のようなバックグラウンドでスクリプトを実行したいと思います。

tailf logfile.log | grep 'patternline' | while read line ; do 
    bash scriptname.sh "$line" & ; 
done

xargs(または他の適切な方法)を並列に使用して上記を実行する方法と、プロセスを制限する方法を知りたいです。

前もって感謝します。

1
AVJ

xargsマニュアルを読み、そこにある-Lフラグと-Pフラグを調べてください。

tail -f logfile.log | grep 'patternline' |
xargs -P 4 -L 1 bash scriptname.sh

これは、一度に最大4つのコマンドインスタンス(-P 4)を実行し、呼び出しごとに1行の入力(-L 1)を使用します。

-txargsに追加して、何が実行されるかを確認します。

1
Kusalananda

GNU Parallelは、引数の引用を正しく行います。

tail -f logfile.log | grep 'patternline' |
  parallel bash scriptname.sh

さらに、デフォルトではCPUコアごとに1プロセスになり、2つの並列ジョブの出力が混在しないようにします。

GNU Parallelは一般的な並列処理機能であり、同じマシン上またはsshアクセスできる複数のマシン上でジョブを簡単に並列実行できます。多くの場合、forループを置き換えることができます。

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

Simple scheduling

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

GNU Parallel scheduling

インストール

GNU Parallelがディストリビューション用にパッケージ化されていない場合は、rootアクセスを必要としない個人インストールを実行できます。これを行うことで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

1
Ole Tange