Ubuntu

並發 curl 無法解析主機

  • February 24, 2018

我嘗試執行並發 curl,但它可以輕鬆報告“無法解析主機”。要並行執行 curl,我使用“並行”。

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

a.sh

#!/bin/bash

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

一個.php

<?php

echo "from some server\n";

僅 4 個並發 curl 如何解決主機故障?我對此進行了模擬,因為我遇到的原始問題在php curl localhost is slow when making concurrent requests中有所描述。我真的不認為這是一個打開文件限制問題,因為只有 4 個並發 curl。誰能解釋為什麼會發生這種情況?順便說一句,作業系統是ubuntu 16.04。


rudimeier 建議使用並行的正確方法。使用後yes | head -n4 | parallel ./a.sh問題不再存在。不過,我原來的問題在那裡。

--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 Parallel讀取文件的內容作為參數。而且由於您提供了 2 個文件,因此它是這些文件的交叉產品。

你想要的是:::

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

你的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

手冊頁的解釋

作業可以是單個命令,也可以是必須為輸入中的每一行執行的小腳本。

引用自:https://unix.stackexchange.com/questions/311380