我正在运行curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0并且我正在尝试设置--最大时间或者 --连接超时,不幸的是这些值似乎没有任何作用。
概念验证1:
time curl -v -k -I --max-time 5 https://myawesomehost/file.test
* Resolving timed out after 5001 milliseconds
* Closing connection 0
curl: (28) Resolving timed out after 5001 milliseconds
real 0m10.031s
user 0m0.011s
sys 0m0.012s
这应该在 5 秒后终止该命令,但花了 10.031 秒
PoC 2:
time curl -v -k -I --connect-timeout 3.0 https://myawesomehost/file.test
* Resolving timed out after 3000 milliseconds
* Closing connection 0
curl: (28) Resolving timed out after 3000 milliseconds
real 0m10.068s
user 0m0.005s
sys 0m0.010s
同样,花费了 10.068 秒。
我发现我可以使用暂停命令行工具,但我想知道curl 有什么问题。
答案1
在没有看到你的情况curl --version
下,让我在遇到这个确切问题的基础上在黑暗中进行尝试。你的curl版本是在没有c-ares的情况下构建的吗?第一行curl --version
应该告诉你:
curl 7.71.0-DEV (x86_64-unknown-linux-gnu) libcurl/7.71.0-DEV c-ares/1.10.0
我最近遇到了同样的问题,DNS 超时导致curl 超过指定的超时。打开详细信息后,它会在 5 秒时显示 DNS 查找 DID 超时,但随后会等到 20 秒才完全超时并关闭。我们 root 导致它的版本没有c-战神(异步 DNS 解析器库)。
我从他们的源代码中构建了它github使用这些指示但添加./configure --enable-ares
c-ares/1.10.0
在这里你可以在版本信息中看到它是用 c-ares 构建的
$ /usr/local/bin/curl --version
curl 7.71.0-DEV (x86_64-unknown-linux-gnu) libcurl/7.71.0-DEV c-ares/1.10.0
Release-Date: [unreleased]
Protocols: dict file ftp gopher http imap pop3 rtsp smtp telnet tftp
Features: AsynchDNS IPv6 Largefile UnixSockets
它的行为符合预期
$ time /usr/local/bin/curl --max-time 5 google.com -v
* Resolving timed out after 5000 milliseconds
* Closing connection 0
curl: (28) Resolving timed out after 5000 milliseconds
real 0m5.002s
user 0m0.000s
sys 0m0.002s
并在没有 c-ares 的情况下构建
/usr/local/bin/curl --version
curl 7.71.0-DEV (x86_64-unknown-linux-gnu) libcurl/7.71.0-DEV
Release-Date: [unreleased]
Protocols: dict file ftp gopher http imap pop3 rtsp smtp telnet tftp
Features: AsynchDNS IPv6 Largefile UnixSockets
超时不起作用:
time /usr/local/bin/curl --max-time 5 google.com -v
* Resolving timed out after 5000 milliseconds
* Closing connection 0
curl: (28) Resolving timed out after 5000 milliseconds
real 0m20.023s
user 0m0.003s
sys 0m0.000s
如果您从源代码构建curl,或者它是您的一个选项,您可能只需要启用该选项。
编辑:JamesTheAwesomeDude 提出了一个很好的观点,即追查这个 cURL 的来源值得弄清楚。就我而言,它是一个运行 Amazon Linux 2 的新 EC2 实例。
$ cat /etc/*-release | grep PRETTY_NAME
PRETTY_NAME="Amazon Linux 2"