并发curl无法解析主机

并发curl无法解析主机

我尝试运行并发curl,但它很容易报告“无法解析主机”。为了并行运行curl,我使用“parallel”。

parallel :::: ./a.sh ./a.sh
from api server
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    16    0    16    0     0  13781      0 --:--:-- --:--:-- --:--:-- 16000
from api server
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    16    0    16    0     0  14925      0 --:--:-- --:--:-- --:--:-- 16000
from api server
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    16    0    16    0     0  15009      0 --:--:-- --:--:-- --:--:-- 16000
from api server
from api server
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    16    0    16    0     0  14324      0 --:--:-- --:--:-- --:--:-- 16000
curl: (6) Could not resolve host: curl
100    16    0    16    0     0  44198      0 --:--:-- --:--:-- --:--:-- 44198

#!/bin/bash

curl http://127.0.0.1:81/a.php

a.php

<?php

echo "from some server\n";

如何解决仅 4 个并发卷曲导致主机失败的问题?我模拟这个是因为我遇到的原始问题描述于phpcurl localhost 在发出并发请求时速度很慢。我真的不认为这是一个打开文件限制问题,因为只有 4 个并发卷曲。谁能解释为什么会发生这种情况?顺便说一下,操作系统是ubuntu 16.04。


鲁迪迈尔建议了使用并行的正确方法。使用后yes | head -n4 | parallel ./a.sh问题不再存在。尽管如此,我原来的问题仍然存在。

答案1

--dryrun当您对 GNU Parallel 运行的内容感到困惑时,您应该尝试使用:

$ parallel --dryrun :::: ./a.sh ./a.sh
#!/bin/bash #!/bin/bash
#!/bin/bash 
#!/bin/bash curl http://127.0.0.1:81/a.php
 #!/bin/bash
 curl http://127.0.0.1:81/a.php
curl http://127.0.0.1:81/a.php #!/bin/bash
curl http://127.0.0.1:81/a.php 
curl http://127.0.0.1:81/a.php curl http://127.0.0.1:81/a.php

这显然不是你想要的。那么发生了什么?

如果分析输出,您会看到第一个文件中的每一行都与第二个文件中的每一行组合在一起。更明显的是:

file-b:
1
2
3

$ parallel --dryrun :::: b b
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

错误在于::::.::::使 GNU 并行化文件的内容作为参数。由于您提供了 2 个文件,因此它会产生这些文件的叉积。

你想要的是:::

$ parallel --dryrun ::: ./a.sh ./a.sh
./a.sh
./a.sh

答案2

你的parallel用法是错误的。

不知何故,第四次运行将执行

curl http://127.0.0.1:81/a.php curl http://127.0.0.1:81/a.php

我不完全理解语法,但这可以工作:

yes | head -n4 | parallel ./a.sh

手册页的解释

作业可以是单个命令或必须针对输入中的每一行运行的小脚本。

相关内容