并行运行多个curl命令

lsmepo6l  于 2022-12-19  发布在  其他
关注(0)|答案(8)|浏览(387)

我有下面的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

有向导吗?

syqv5f0l

syqv5f0l1#

您可以使用带有-P选项的xargs来并行运行任何命令:

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

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

ufj5ltwl

ufj5ltwl2#

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

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

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

j7dteeu8

j7dteeu83#

2020年更新:

Curl现在可以并行获取多个网站:

curl --parallel --parallel-immediate --parallel-max 3 --config websites.txt

websites.txt文件:

url = "website1.com"
url = "website2.com"
url = "website3.com"
v64noz0r

v64noz0r4#

这是对@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"

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

5cg8jx4n

5cg8jx4n5#

除了@saeed's答案之外,我还创建了一个泛型函数,它利用函数参数在并行的M作业中总共触发N次命令

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中会使操作变得更加简单。Gist

7xllpg7q

7xllpg7q6#

在结尾处加上“等待”,并将其置于背景中。

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 &
mzsu5hc0

mzsu5hc07#

我想分享一下我如何在curl中使用并行xargs的例子。
使用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有效负载中

liwlm1x9

liwlm1x98#

根据@isopropylcyanide提供的解决方案和@Dario Seidl的评论,我发现这是最好的响应,因为它可以处理curl和httpie。

# conc N M cmd - fire (N) commands at a max parallelism of (M) each
function conc(){
    cmd=("${@:3}")
    seq 1 "$1" | xargs -I'$XARGI' -P"$2" "${cmd[@]}"
}

例如:

conc 10 3 curl -L -X POST https://httpbin.org/post -H 'Authorization: Basic dXNlcjpwYXNz' -H 'Content-Type: application/json' -d '{"url":"http://google.com/","foo":"bar"}'

conc 10 3 http --ignore-stdin -F -a user:pass httpbin.org/post url=http://google.com/ foo=bar

相关问题