だから私はwhileループを持っています:
cat live_hosts | while read Host; do \
sortstuff.sh -a "$Host" > sortedstuff-"$Host"; done
ただし、これには時間がかかる場合があります。このwhileループにGNU Parallelをどのように使用しますか?
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
昔ながらのUnixの「1つのことをうまくやる」ので、文字列置換をラッパースクリプトに入れました。
#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"
あなたがそれを呼ぶならwrapper.sh
、それを呼び出すparallel
コマンドは次のようになります。
parallel wrapper.sh < live_hosts
この種のものにはcat
は必要ないことに注意してください。これにより、外部プログラムの呼び出しが節約されます。
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
を使用すると、特定の側面の管理が容易になります。並行して実行するジョブの数をより簡単に制限できます。