xargs、ロギング、標準入力

xargs、ロギング、標準入力

ゼロバイトで区切られたレコードファイルがあります。

Record 1, Line 1
Record 1, Line 2
[zero byte]
Record 2, Line 1
Record 2, Line 2

各レコードに対して "process.sh"コマンドを一度実行し、そのレコードを標準入力として使用したいと思います。

bash process-one-record-stdin.sh <record-contents

これを行うには、xargs、パラレル、または他のツールを使用できますか? (Bashスクリプトの使い方を知っていますが、可能であれば組み込みツールを使用することをお勧めします)

やる気

magic-xargs-type-command-here -0 all-records.txt -- xargs -d"\n" -- bash process-one-record-arguments.sh

答え1

GNU Parallelがある場合は、次のことができます。

parallel --rrs --recend '\0' -N1 --pipe bash process-one-record-stdin.sh <record-contents

すべての新しいコンピュータにはマルチコアがありますが、ほとんどのプログラムは本質的にシリアルなので、マルチコアを使用しません。しかし、多くのタスクは非常に並列化可能です。

  • 複数のファイルで同じプログラムを実行する
  • ファイルの各行に対して同じプログラムを実行します。
  • ファイルの各ブロックに対して同じプログラムを実行します。

GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。

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

簡単なスケジューリング

代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。

GNU並列スケジューリング

インストールする

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

答え2

xargを使ってこれを行うことはできますか?

xargsの場合、利用可能なオプションは次のとおりです。

--null -0 空白ではなく null 文字でエントリを終了します。

-n max-args コマンドラインごとに最大 max-args 個の引数を使用します。

$ echo -ne "line 111\0000line 222\0000\0000line 333\0000\0000" | \
     xargs -I '{}' --null -n 1 bash -c "echo handling this input: '{}'. OK"
handling this input: line 111. OK
handling this input: line 222. OK
handling this input: . OK
handling this input: line 333. OK
handling this input: . OK

関連情報