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 - Minuten
  • h - Stunden
  • d - 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.