Linux-timeout-Befehl
timeout ist ein praktischer Befehl in Linux-Systemen, der verwendet wird, um laufende Befehle nach einer festgelegten Zeit zu beenden. Dieser Befehl eignet sich besonders für die folgenden Szenarien:
- Lang laufende Prozesse begrenzen
- Verhindern, dass Skripte oder Programme unbegrenzt ausgeführt werden
- Ausführungszeitlimits für kritische Vorgänge festlegen
- Timeout-Steuerung in automatisierten Tests
Der Befehl timeout ist Teil des GNU-coreutils-Pakets und in den meisten Linux-Distributionen vorinstalliert.
Befehlssyntax
Das grundlegende Syntaxformat des timeout-Befehls lautet wie folgt:
timeout [选项] 持续时间 命令 [参数...]
Parameterbeschreibung
-
Dauer:
- Kann eine reine Zahl sein (Standardeinheit ist Sekunden)
- Kann auch eine Einheit angeben:
10s(10 Sekunden),5m(5 Minuten),1h(1 Stunde) - Unterstützt Dezimalzahlen:
0.5s(500 Millisekunden),1.5m(1 Minute 30 Sekunden)
-
Befehl:
- Der auszuführende Befehl oder das Programm
- Kann ein eingebauter Befehl oder ein externes Programm sein
-
Parameters:
- An den Befehl übergebene Argumente
Häufige Optionen
| Option | Beschreibung | Beispiel |
|---|---|---|
-soder--signal |
Gibt das nach dem Timeout gesendete Signal an (Standard ist TERM) | timeout -s KILL 5s command |
-koder--kill-after |
Wenn das anfängliche Signal unwirksam ist, sende nach der angegebenen Zeit das KILL-Signal | timeout -k 5s 10s command |
--preserve-status |
Gibt den Exit-Status des beendeten Befehls zurück | timeout --preserve-status 5s command |
--foreground |
Führe den Befehl im Vordergrund aus (Standard: Hintergrund) | timeout --foreground 5s command |
-voder--verbose |
Zeige ausführliche Ausgabe an | timeout -v 5s command |
Anwendungsbeispiele
Grundlegende Verwendung
Beispiel
timeout 5s ping example.com
# Beende die Skriptausführung nach 1 Minute
timeout 1m ./long_script.sh
Signaltyp angeben
Beispiel
timeout -s INT 3s command
# Sende KILL-Signal nach 10 Sekunden (erzwungene Beendigung)
timeout -s KILL 10s command
Kombinierte Verwendung
Beispiel
timeout -k 5s 10s command
Exit-Status ermitteln
Beispiel
timeout --preserve-status 5s command
echo $? # Exit-Statuscode anzeigen
Praktische Anwendungsszenarien
1. Unendliche Skriptausführung verhindern
Beispiel
timeout 2h ./backup_database.sh
2. Timeout-Steuerung in automatisierten Tests
Beispiel
timeout 30s ./run_test_case.sh
3. Timeout bei Netzwerkoperationen
Beispiel
timeout 1m wget http://example.com/large_file.zip
4. Umgang mit Timeouts bei interaktiven Programmen
Beispiel
timeout 10s read -p "Bitte geben Sie Ihre Auswahl ein: " choice
Hinweise
-
Signalbehandlung:
- Einige Programme fangen das TERM-Signal möglicherweise ab und ignorieren es; in diesem Fall ist das KILL-Signal erforderlich
- Verwenden Sie das KILL-Signal bei wichtigen Datenoperationen mit Vorsicht, da es Datenbeschädigungen verursachen kann
-
Umgang mit Kindprozessen:
- Standardmäßig beendet timeout nur den Prozess, den es direkt gestartet hat, nicht unbedingt alle Kindprozesse
- Um den gesamten Prozessbaum zu beenden, erwägen Sie eine Kombination mit
killdem Befehl
-
Zeitpräzision:
- Die Zeitpräzision des Linux-Kernels liegt üblicherweise im Millisekundenbereich
- Sehr kurze Zeitdauern (wie z. B. 0.001s) können möglicherweise nicht präzise gesteuert werden
-
Rückgabewerte:
- Wenn der Befehl vor dem Timeout abgeschlossen wird, wird der Exit-Status des Befehls zurückgegeben
- Wenn aufgrund eines Timeouts beendet, wird 124 zurückgegeben
- Wenn timeout selbst auf einen Fehler stößt, werden 125-128 zurückgegeben
Fortgeschrittene Tipps
1. Kombination mit anderen Befehlen
Beispiel
timeout 30s command || echo "Befehl hat das Zeitlimit überschritten, Bereinigung wird durchgeführt..."
2. Verwendung in Skripten
Beispiel
if timeout 10s command; then
echo "Befehl erfolgreich abgeschlossen"
else
echo "Befehl hat Zeitüberschreitung oder ist fehlgeschlagen"
fi
3. Überwachung der Ressourcennutzung
Beispiel
(ulimit -t 10; timeout 20s command)
FAQ
F1: Was ist der Unterschied zwischen timeout und sleep?
A: sleep wartet einfach eine festgelegte Zeit, während timeout die Ausführungszeit eines anderen Befehls begrenzt.
F2: Wie beendet man alle von timeout gestarteten Kindprozesse?
A: Sie können die Prozessgruppenmethode verwenden:
timeout --foreground 10s sh -c 'command & wait'
F3: Warum beendet sich mein Programm nach timeout nicht sofort?
A: Das kann daran liegen, dass das Programm das standardmäßige TERM-Signal abgefangen hat; versuchen Sie es mit dem-s KILLOption.
Q4: Wie stellt man fest, ob ein Befehl aufgrund einer Zeitüberschreitung beendet wurde?
A: Prüfen Sie, ob der Exit-Status-Code 124 lautet:
Beispiel
if [ $? -eq 124 ]; then
echo "Befehl aufgrund einer Zeitüberschreitung beendet"
fi
Zusammenfassung
Der timeout-Befehl ist ein sehr nützliches Werkzeug in der Linux-Systemadministration; er kann uns helfen:
- Die Programmausführungszeit steuern, um zu verhindern, dass Ressourcen über lange Zeiträume belegt werden
- Die Robustheit von Skripten verbessern und unendliches Warten vermeiden
- Timeout-Mechanismen in automatisierten Abläufen implementieren
- Vorgänge mit unvorhersehbaren Ausführungszeiten handhaben
Durch die ordnungsgemäße Verwendung des timeout-Befehls können Sie Ihre Linux-Systemadministration effizienter und zuverlässiger machen.
Andere Erweiterungen
Linux-Befehlsreferenz