web-dev-qa-db-ja.com

このwhileループにGNU Parallelをどのように使用しますか?

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

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

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

12
Proletariat

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

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

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

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

昔ながらのUnixの「1つのことをうまくやる」ので、文字列置換をラッパースクリプトに入れました。

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

あなたがそれを呼ぶならwrapper.sh、それを呼び出すparallelコマンドは次のようになります。

parallel wrapper.sh < live_hosts

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

3
Warren Young

needparallelしないでください。ループの本体は以前の反復に依存しないためです。ホストごとに新しいバックグラウンドプロセスを開始するだけです。

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

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

2
chepner