web-dev-qa-db-ja.com

curl max-timeとconnect-timeoutがまったく機能しない

Curl 7.68.0(x86_64-pc-linux-gnu)libcurl/7.68.0を実行していますが、-max-timeを設定しようとしていますまたは-connect-timeout、残念ながらこれらの値は何もしないようです。

PoC 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秒かかりました。

timeoutコマンドラインツールを使用できることがわかりましたが、curlの問題を知りたいのですが。

1
Eric Johnson

あなたのcurl --versionを見ずに、この正確な問題にぶつかったことに基づいて、暗闇の中で試してみましょう。あなたのバージョンのcurlはc-areなしでビルドされていますか? curl --versionの最初の行で、次のことがわかります。

curl 7.71.0-DEV (x86_64-unknown-linux-gnu) libcurl/7.71.0-DEV c-ares/1.10.0

最近、DNSタイムアウトが原因でcurlが指定されたタイムアウトを超えるという同じ問題に遭遇しました。冗長をオンにすると、DNSルックアップが表示されますDIDタイムアウトは5秒ですが、20秒になるまで待機して完全にタイムアウトして閉じます。rootが原因で c- ares (非同期DNSリゾルバーライブラリ)。

私はそれらから取得したソースからそれをビルドしました github これらを使用して instructions を追加しますが、./configure --enable-aresを追加します

ここでは、バージョン情報でc-ares c-ares/1.10.0を使用してビルドされていることがわかります。

$ /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"
1
Anthony T