Timeouts
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.