curlのタイムアウト設定

curlで接続タイムアウトと転送タイムアウトを設定する方法を解説。--connect-timeout、--max-time、リトライロジック、速度ベースの制限でリクエストのハングを防止しましょう。

General

詳細な説明

curlのタイムアウト設定

タイムアウトは堅牢なHTTPクライアントを構築するために不可欠です。適切なタイムアウトがなければ、リクエストが無限にハングし、スクリプトをブロックしてリソースを消費する可能性があります。curlは複数のタイムアウト機構を提供しています。

接続タイムアウト

--connect-timeout フラグは、curlがTCP接続の確立を待つ最大時間を秒単位で設定します:

curl --connect-timeout 5 https://api.example.com/data

サーバーが5秒以内に応答しない場合、curlは終了コード28で中断します。

リクエスト全体のタイムアウト

--max-time(または -m)フラグは、DNS解決、接続、転送、レスポンスを含む操作全体の最大時間を設定します:

curl --max-time 30 https://api.example.com/large-download

タイムアウトの組み合わせ

ベストプラクティスは両方のタイムアウトを設定することです:

curl --connect-timeout 5 --max-time 30 https://api.example.com/data

これにより、接続に5秒、リクエスト・レスポンスサイクル全体に30秒の制限が設けられます。

DNSタイムアウト

DNS解決の遅延がボトルネックになることがあります。--dns-servers でより高速なDNSサーバーを指定するか、--resolve でDNSをスキップします:

curl --resolve api.example.com:443:93.184.216.34 \
  https://api.example.com/data

速度ベースのタイムアウト

--speed-limit--speed-time で低速な転送を中断します:

curl --speed-limit 1000 --speed-time 15 https://example.com/file.zip

これは、転送速度が15秒連続で毎秒1000バイト未満に低下した場合に中断します。

リトライ付きタイムアウト

タイムアウトとリトライロジックを組み合わせて、回復力のあるリクエストを実現します:

curl --connect-timeout 5 --max-time 30 \
  --retry 3 --retry-delay 2 --retry-max-time 120 \
  https://api.example.com/data

これは、2秒間隔で最大3回リトライし、リトライ全体のウィンドウは120秒です。

スクリプトでのタイムアウト

シェルスクリプトでは、ゾンビプロセスを防止するために必ずタイムアウトを設定しましょう:

if ! curl -sf --connect-timeout 5 --max-time 30 https://api.example.com/health; then
  echo "Health check failed" >&2
  exit 1
fi

終了コード

  • 28: 操作がタイムアウトした
  • 7: ホストへの接続に失敗した
  • 6: ホスト名を解決できなかった

適切なタイムアウト設定は、本番スクリプト、CI/CDパイプライン、無応答のエンドポイントを迅速に検出する必要がある監視システムに不可欠です。

ユースケース

DevOpsエンジニアがヘルスチェックスクリプトを作成する際に、サービスが無応答の場合に素早く失敗し、許容可能なレイテンシウィンドウ内でアラートを発生させる必要がある場合に使用します。

Try It — Curl to Code Converter

フルツールを開く