Der Befehl timeout führt einen anderen Befehl aus und beendet ihn automatisch nach Ablauf einer festgelegten Zeitspanne. Das ist besonders nützlich für Befehle, die keine eigene Timeout-Option mitbringen.
Syntax des timeout-Befehls
timeout [OPTIONEN] DAUER BEFEHL [ARGUMENTE]
DAUER- Die maximale Laufzeit, nach der der Befehl beendet wird.BEFEHL- Der auszuführende Befehl mit optionalen Argumenten.
Die Dauer kann als Ganzzahl oder Dezimalzahl angegeben werden, gefolgt von einem optionalen Einheitensuffix:
s- Sekunden (Standard)m- Minutenh- Stundend- Tage
Ohne Suffix wird die Dauer in Sekunden interpretiert. Eine Dauer von 0 deaktiviert das Zeitlimit.
Grundlegende Verwendung
In der einfachsten Form gibst du eine Zeitdauer und den auszuführenden Befehl an:
timeout 5 ping 8.8.8.8
Dieser Befehl führt ping aus und beendet ihn nach 5 Sekunden.
Für längere Zeitspannen verwendest du die entsprechenden Suffixe:
timeout 5m ping 8.8.8.8
Dezimalwerte sind ebenfalls möglich. Der folgende Befehl läuft 1 Minute und 6 Sekunden (1,1 Minuten):
timeout 1.1m ping 8.8.8.8
Verwendung mit Root-Rechten
Befehle wie tcpdump benötigen erhöhte Rechte. Setze sudo vor den gesamten timeout-Befehl:
sudo timeout 300 tcpdump -n -w data.pcap
Ein bestimmtes Signal senden
Standardmäßig sendet timeout das Signal SIGTERM, wenn die Zeit abläuft. Mit der Option -s (--signal) legst du ein anderes Signal fest:
timeout -s SIGKILL 5 ping 8.8.8.8
Du kannst das Signal über seinen Namen oder seine Nummer angeben. Diese beiden Befehle sind gleichwertig:
timeout -s SIGKILL 5 ping 8.8.8.8
timeout -s 9 5 ping 8.8.8.8
Eine Liste aller verfügbaren Signale erhältst du mit:
kill -l
Blockierte Prozesse beenden
Manche Prozesse fangen das SIGTERM-Signal ab oder ignorieren es. Mit der Option -k (--kill-after) sendest du nach einer zusätzlichen Wartezeit das nicht ignorierbare SIGKILL-Signal:
timeout -k 10 1m ping 8.8.8.8
Dieser Befehl versucht ping nach einer Minute mit SIGTERM zu beenden. Falls der Prozess nach weiteren 10 Sekunden noch läuft, wird er mit SIGKILL zwangsbeendet.
Exit-Status beibehalten
Standardmäßig gibt timeout den Exit-Code 124 zurück, wenn das Zeitlimit erreicht wird. Mit --preserve-status erhältst du stattdessen den Exit-Status des ausgeführten Befehls:
timeout --preserve-status 5 ping 8.8.8.8
Das ist nützlich, wenn du in Skripten den ursprünglichen Exit-Code auswerten möchtest.
Ausführung im Vordergrund
Standardmäßig läuft der überwachte Befehl im Hintergrund. Die Option --foreground führt ihn stattdessen im Vordergrund aus:
timeout --foreground 5m ./script.sh
Diese Option benötigst du bei interaktiven Befehlen, die Benutzereingaben erwarten.
Zusammenfassung
Der timeout-Befehl begrenzt die Laufzeit anderer Befehle. Mit -s änderst du das Beendigungssignal, mit -k stellst du die zuverlässige Beendigung hartnäckiger Prozesse sicher.