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

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

だからwhileループがあります。

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

しかし、時間がかかることがあります。このwhileループを実行するためにGNU Parallelをどのように使用しますか?

答え1

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

答え2

「うまくやる」ことをする古いUnixユーザーとして、私は文字列置換の内容をラッパースクリプトに入れます。

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

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

parallel wrapper.sh < live_hosts

cat外部プログラム呼び出しを保存するこの種の操作は必要ありません。

答え3

あなたはしません必要 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ただし、一部の側面では、管理が容易になり、同時に実行されるジョブの数をより簡単に制限できます。

関連情報