并行运行多个curl命令

时间:2017-09-22 10:15:15

标签: bash shell curl

我有以下shell脚本。问题是我想并行/并发地运行事务而不等待一个请求完成转到下一个请求。例如,如果我发出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

任何指南?

6 个答案:

答案 0 :(得分:12)

使用xargs -P选项,您可以并行运行任何命令:

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

这将运行给curl命令400次并行最多8个作业。

答案 1 :(得分:4)

这是@saeed's答案的补充。

我遇到了一个问题,它向以下主机发出了不必要的请求

0.0.0.1, 0.0.0.2 .... 0.0.0.N

原因是命令xargs将参数传递给curl命令。为了防止传递参数,我们可以使用-I标志指定要替换参数的字符。

所以我们将其用作

 ... xargs -I '$' command ...

现在,xargs将替换找到$文字的位置的参数。如果找不到,则不传递参数。因此,使用此命令将是最终命令。

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

注意:如果您在命令中使用$,请尝试将其替换为其他未使用的字符。

答案 2 :(得分:2)

除了@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/'

这将以最大两个并行度触发10 curl命令。

将此功能添加到bash_profile.rc使其更容易。 Gist

答案 3 :(得分:1)

在最后添加“等待”,并将它们作为背景。

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 &

答案 4 :(得分:0)

您可以将xargs-P选项一起使用来并行运行任何命令:

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

这将运行curl命令200次,最多可并行执行10个作业。

答案 5 :(得分:0)

想分享我如何将并行 xargs 与 curl 结合使用的示例。

使用 xargs 的优点是,您可以指定将使用多少个线程来并行化 curl,而不是使用带有“&”的 curl 来同时调度所有比方说 10000 个 curl。

希望对smdy有所帮助:

#!/bin/sh

url=/any-url
currentDate=$(date +%Y-%m-%d)
payload='{"field1":"value1", "field2":{},"timestamp":"'$currentDate'"}'
threadCount=10

cat $1 | \
xargs -P $threadCount -I {} curl -sw 'url= %{url_effective}, http_status_code = %{http_code},time_total = %{time_total} seconds \n' -H "Content-Type: application/json" -H "Accept: application/json" -X POST $url --max-time 60 -d $payload

.csv 文件每行有 1 个值,将插入到 json 负载中