web-dev-qa-db-ja.com

複数のcurlコマンドを並行して実行する

次のシェルスクリプトがあります。問題は、1つの要求が終了して次の要求に進むのを待たずに、トランザクションを並列/並行して実行したいことです。たとえば、20個のリクエストを行った場合、それらを同時に実行してもらいます。

for ((request=1;request<=20;request++))
do
    for ((x=1;x<=20;x++))
    do
        time curl -X POST --header "http://localhost:5000/example"
    done
done

ガイドは?

12
user5836023

xargs -Pオプションを使用すると、任意のコマンドを並行して実行できます。

xargs -I % -P 8 curl -X POST --header "http://localhost:5000/example" \
< <(printf '%s\n' {1..400})

これにより、give curlコマンドが400回実行され、最大8つのジョブが並行して実行されます。

15
anubhava

xargs-Pオプションを使用して、任意のコマンドを並行して実行できます。

seq 1 200 | xargs -n1 -P10  curl "http://localhost:5000/example"

これにより、curlコマンドが200回実行され、最大10個のジョブが並行して実行されます。

3
Saeed Mohtasham

最後に「待機」を追加し、背景を付けます。

for ((request=1;request<=20;request++))
do
    for ((x=1;x<=20;x++))
    do
        time curl -X POST --header "http://localhost:5000/example" &
    done
done

wait

それらはすべて同じstdoutに出力しますが、時間の結果(およびstdoutとstderr)を名前付きファイルにリダイレクトできます。

time curl -X POST --header "http://localhost:5000/example" > output.${x}.${request}.out 2>1 &
1

@saeed'sの回答に加えて、並列でNジョブで合計M回コマンドを実行する関数引数を使用する汎用関数を作成しました

function conc(){
    cmd=("${@:3}")
    seq 1 "$1" | xargs -n1 -P"$2" "${cmd[@]}"
}
$ conc N M cmd
$ conc 10 2 curl --location --request GET 'http://google.com/'

これにより、最大2つの並列処理で10 curlコマンドが実行されます。

この関数をbash_profile.rcに追加すると、より簡単になります。

0
Aman Garg