Bashスクリプトからcurl
で5つのparallel
リクエストを実行する最良の方法は何ですか?パフォーマンス上の理由から、シリアルで実行することはできません。
コマンドの後に「&」を使用してプロセスをバックグラウンド化し、「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
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
このようなタスクには gnu parallel を使用します。
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.