如何从 bash shell 脚本并行调用服务 URL?

dav*_*vid 9 bash download shell-script multithreading

我有一个从另一个应用程序调用的服务。以下是我正在调用的服务 URL -

http://www.betaservice.domain.host.com/web/hasChanged?ver=0
Run Code Online (Sandbox Code Playgroud)

我需要以多线程方式对我上面的服务 URL 进行一些负载测试,而不是一个一个依次调用。

bash shell 脚本有什么办法,我可以通过以多线程方式调用上面的服务 URL 来加载它吗?如果可能的话,我可以让 60-70 个线程非常快地并行调用上面的 URL 吗?

ter*_*don 13

我不会将其称为多线程,但您可以简单地在后台启动 70 个作业:

for i in {1..70}; do 
   wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0 2>/dev/null &
done
Run Code Online (Sandbox Code Playgroud)

这将导致同时wget运行70 个进程。你也可以做一些更复杂的事情,比如这个小脚本:

#!/usr/bin/env bash

## The time (in minutes) the script will run for. Change 10
## to whatever you want.
end=$(date -d "10 minutes" +%s);

## Run until the desired time has passed.
while [ $(date +%s) -lt "$end" ]; do 
    ## Launch a new wget process if there are
    ## less than 70 running. This assumes there
    ## are no other active wget processes.
    if [ $(pgrep -c wget) -lt 70 ]; then
        wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0 2>/dev/null &
    fi
done
Run Code Online (Sandbox Code Playgroud)


小智 9

试试 ab,你也会得到一个很好的统计数据:

ab -n 10000 -c 70 http://www.betaservice.domain.host.com/web/hasChanged?ver=0
Run Code Online (Sandbox Code Playgroud)

此调用将执行 10000 个请求,并发 70 个并行查询。


Ram*_*esh 5

您可以尝试安装 GNU 并行。您可以从这里获得一些 GNU 并行示例。

测试

gnu-parallel在我的机器上从源代码安装,我可以让它工作。

你可以从这里从源代码安装它。我有一个红帽系统,所以我下载了Fedora的包,然后跑了.configuremakemake install得到了parallel安装在我的系统。

现在,成功安装后,我创建了一个目录checking并运行以下命令。

seq 10 | parallel -n0  wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,上面的命令为我下载了 10 个网页副本。你可以用 设置你想要的数字seq

有关如何并行运行相同命令的更多信息,您可以从此处验证 gnu-parallel 提供的示例。从示例页面,

如果要并行运行具有相同参数的相同命令 10 次,您可以执行以下操作:

序列 10 | 并行 -n0 my_command my_args

编辑

现在,为了利用parallel执行,您可以使用命令作为,

 seq 70 | parallel -j70 wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0
Run Code Online (Sandbox Code Playgroud)

-j选项可以根据 CPU 内核总数指定可以并行执行的总作业数。