12

シェルスクリプトでxargsを使用して、同じスクリプトで定義した関数の並列インスタンスを実行しようとしています。この関数はページのフェッチの時間を計測するため、バックグラウンドプロセスではなく、並列プロセスでページが実際に同時にフェッチされることが重要です(これについての私の理解が間違っていて、2つの間に無視できる違いがある場合は、お知らせください) 。

関数は次のとおりです。

function time_a_url ()
{
     oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2)
     echo "Fetching $1 took $oneurltime seconds."
}

引数としてtime_a_urlを並列に実行するのに何回もかかる可能性のある形式のxargsパイプを使用して、これをどのように行うのですか?そして、はい、私はGNU parallelについて知っています、私はこれを書いているところにソフトウェアをインストールする特権を持っていません。

4

3 に答える 3

12

関数を機能させる方法のデモを次に示します。

$ f() { echo "[$@]"; }
$ export -f f
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\}
[b 1]
[d 3 4]
[c 2]

exportこれを機能させるための鍵はbash、スポーンがそれを認識しxargs、関数名とエスケープされた中括弧の間のスペースをエスケープするように関数にあります。あなたはこれをあなたの状況で働くように適応させることができるはずです。ニーズに合わせて、引数を調整する-P-nまたは削除する)必要があります。

grepあなたはおそらくとを取り除くことができますcut。Bashビルトインを使用している場合は、変数timeを使用して出力形式を指定できます。TIMEFORMATGNUを使用している場合は、引数/usr/bin/timeを使用できます。--formatこれらのいずれかを使用すると、もドロップできます-p

wgetコマンドのこの部分を:に置き換えることができ2>&1 1>/dev/nullます-q。いずれにせよ、あなたはそれらを逆にします。正しい順序はです>/dev/null 2>&1

于 2010-07-23T23:03:19.273 に答える
1

Mac OS Xの場合:

xargs:最大 プロセスは>0でなければなりません(xargs -P [> 0]の場合)

f() { echo "[$@]"; }
export -f f

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\}

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "$@"' arg0 '{}'
于 2010-07-24T15:21:53.380 に答える
0

GNU Parallelを別のシステムにインストールすると、機能が1つのファイル(パラレルと呼ばれる)に含まれていることがわかります。

そのファイルを自分の〜/binにコピーするだけでよいはずです。

于 2010-07-23T21:43:19.647 に答える