Timeouts

Veröffentlicht am:

Die wichtigsten Befehle zum Merken

  • curl --connect-timeout — Verbindungsaufbau begrenzen.
  • curl --max-time — gesamte Übertragung begrenzen.
  • curl --write-out — Zeiten auch bei fehlgeschlagenem Transfer prüfen.

Befehle und Optionen

Befehl oder Syntax Bedeutung
--silent --show-error Fortschritt ausblenden, Fehler behalten.
--connect-timeout 1 Eine Sekunde für die Verbindungsphase erlauben.
--max-time 2 / 10 Zwei / zehn Sekunden für den gesamten Transfer erlauben.
--output /dev/null Antwortinhalt verwerfen.
--write-out '…' Danach Zeitfelder ausgeben.
time_connect / time_starttransfer / time_total Sekunden seit Start bis Verbindung, erstem Antwortbyte und Ende oder Fehler.
printf … "$?" Status des unmittelbar vorherigen Befehls ausgeben.

Das Format enthält curl-Felder und Zeilenumbruchsyntax. Erfolgreicher Transportstatus beweist keinen HTTP-Anwendungserfolg; HTTP-Fehler werden hier nicht zum curl-Fehler gemacht.

Die entscheidenden Konzepte

1. Ein Timeout begrenzt das Warten eines Beteiligten

Ein Timeout begrenzt Wartezeit für Operation oder Phase. Er verhindert unbegrenzten Ressourcenbesitz bei langsamen oder unerreichbaren Abhängigkeiten.

Die Grenze gehört diesem Aufrufer. Sie stoppt nicht zwingend den entfernten Dienst oder Datenbankarbeit und macht keine bereits erfolgte Aktion rückgängig. Ein Timeout ist eine unvollständige Ergebnisbeobachtung, keine Aussage, dass nichts geschah.

2. Verbindungszeit und Antwortzeit unterscheiden sich

Verbindungsaufbau kann DNS und nötige Transport- oder Sicherheitshandshakes enthalten. Danach kann ein Server weiterhin lange bis zum ersten Byte oder vollständigen Antwortende brauchen.

Ein Verbindungstimeout begrenzt deshalb nicht die gesamte Anfrage. Ergänze eine Gesamtgrenze, wenn der Aufrufer sie benötigt. Phasenzeiten unterscheiden langsamen Aufbau von Warten bei bestehender Verbindung.

3. Fristen sollen die gesamte Aufrufkette abdecken

Hat eine Benutzeranfrage ein Gesamtbudget, müssen nachgelagerte Aufrufe in die Restzeit passen. Jeder Unteranfrage erneut das volle Budget zu geben kann die gewünschte Gesamtdauer weit überschreiten.

Eine Deadline bezeichnet den Zeitpunkt, ab dem das Ergebnis nicht mehr nützlich ist. Weitergereichte Restbudgets und unterstützte Abbrüche begrenzen unnötige Arbeit. Auch Warteschlangen und Retries verbrauchen Benutzerzeit.

4. Grenzen balancieren Geduld und Ressourcenverbrauch

Zu kurze Grenzen verwerfen brauchbare Arbeit bei normaler Schwankung. Zu lange halten bei Ausfällen Aufrufer, Verbindungen und Speicher fest. Wähle nach gemessener Latenz und Operationszweck.

Nach Timeout einer Änderung solltest du Ergebnisstatus klären oder geeignete Idempotenz verwenden. Sonst kann Wiederholung eine bereits erfolgte Aktion verdoppeln. Lesende Beispiele zeigen Warteverhalten ohne diese fachliche Änderungsmehrdeutigkeit.

Ein kleines Beispiel

Optional: Nutze den vorhandenen Fünf-Sekunden-Endpunkt. Führe jeden curl-Aufruf mit unmittelbar folgendem printf aus. Die Befehle erstellen keinen Verzögerungsserver.

curl --silent --show-error --connect-timeout 1 --max-time 2 --output /dev/null --write-out 'connect=%{time_connect}s first_byte=%{time_starttransfer}s total=%{time_total}s\n' http://localhost:8080/slow
printf 'curl_exit=%s\n' "$?"
curl --silent --show-error --connect-timeout 1 --max-time 10 --output /dev/null --write-out 'connect=%{time_connect}s first_byte=%{time_starttransfer}s total=%{time_total}s\n' http://localhost:8080/slow
printf 'curl_exit=%s\n' "$?"

Der erste Versuch sollte trotz schneller Verbindung die Zweisekunden-Gesamtgrenze erreichen; curl meldet normalerweise Status 28. Der längere Versuch kann innerhalb seines Budgets eine Antwort erhalten.

Vergleiche Verbindungs- und Gesamtzeit. Null bei erstem Byte kann fehlenden Empfang statt sofortiger Verarbeitung bedeuten. Zeiten variieren. Connection refused zeigt einen fehlenden Testdienst, keine langsame Antwort. Dauerhafte Dateien entstehen nicht.

Merke dir: Ein Timeout beendet dein Warten. Er beweist nicht, dass die entfernte Operation scheiterte oder nie lief.