このwhileループにGNU Parallelを使用するにはどうすればよいですか?


12

だから私はwhileループを持っています:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

しかし、これには長い時間がかかる場合があります。このwhileループにGNU Parallelを使用するにはどうすればよいですか?

回答:


13

whileループは使用しません。

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

パスがlive_hosts(たとえば/some/dir/file)に展開されている場合sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(結果はno such file or directory)であるため、これは機能しないことに注意してください。これらの場合は{//}{/}以下を使用します(詳細はgnu-parallelマニュアルを参照):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts

出力を入れるときにteewith を使用することは可能ですか?そのため、出力を確認できます。parallelsortedstuff
プロレタリアート

1
@Proletariat-ターミナルにも出力したいですか?たとえば、最初のコマンドが次のように置き換え>られ| teeます parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti

3

古い学校の「1つのことをして、それをうまくやる」Unixの男として、文字列置換をラッパースクリプトに入れました。

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

呼び出す場合wrapper.sh、呼び出すparallelコマンドは次のようになります。

parallel wrapper.sh < live_hosts

catこの種のことは必要ないことに注意してください。これにより、外部プログラムの呼び出しが保存されます。


2

ループの本体は以前の反復に依存しないため、必要ありparallelません。ホストごとに新しいバックグラウンドプロセスを開始するだけです。

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallelただし、特定の側面の管理が容易になります。並行して実行するジョブの数をより簡単に制限できます。


3
wc -l live_hostsディスクスピンドルまたはCPUコアの数よりも大きい場合(タスクがI / OであるかCPUバインドであるかによって異なります)、そのようなソリューションで並列処理から得られる多くの利点を使い果たしてしまいます。parallel処理速度を目標とする場合、ジョブの数を制限する機能は優れているだけでなく、ほぼ不可欠です。
ウォーレンヤング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.