web-dev-qa-db-ja.com

bashで並行してcurlリクエストを実行する

Bashスクリプトからcurlで5つのparallelリクエストを実行する最良の方法は何ですか?パフォーマンス上の理由から、シリアルで実行することはできません。

23
Justin

コマンドの後に「&」を使用してプロセスをバックグラウンド化し、「wait」を使用してプロセスが完了するまで待機します。サブシェルを作成する必要がある場合は、コマンドの周りに「()」を使用します。

#!/bin/bash

curl -s -o foo http://example.com/file1 && echo "done1" &
curl -s -o bar http://example.com/file2 && echo "done2" & 
curl -s -o baz http://example.com/file3 && echo "done3" &

wait
34
Anton Cohen

xargsには、プロセスを並行して実行するための「-P」パラメーターがあります。例えば:

wget -nv http://en.wikipedia.org/wiki/Linux -O- | egrep -o "http://[^[:space:]]*.jpg" | xargs -P 10 -r -n 1 wget -nv

リファレンス: http://www.commandlinefu.com/commands/view/3269/parallel-file-downloading-with-wget

10
Fan___

このようなタスクには gnu parallel を使用します。

6

curlを使用したxargsの例を次に示します。

$ cat URLS.txt | xargs -P 10 -n 1 curl

上記の例では、一度に10個ずつ、各URLを並行してcurlする必要があります。 -n 1が存在するので、xargsは、curlの実行ごとにURLS.txtファイルの1行のみを使用します。

各xargsパラメーターの機能:

$ man xargs

-P maxprocs
             Parallel mode: run at most maxprocs invocations of utility at once.
-n number
             Set the maximum number of arguments taken from standard input for 
             each invocation of utility.  An invocation of utility will use less 
             than number standard input arguments if the number of bytes 
             accumulated (see the -s option) exceeds the specified size or there 
             are fewer than number arguments remaining for the last invocation of 
             utility.  The current default value for number is 5000.
0
Charlie Le