Linux-timeout-Befehl

Linux 命令大全Linux-Befehlsreferenz


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

  1. 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)
  2. Befehl:

    • Der auszuführende Befehl oder das Programm
    • Kann ein eingebauter Befehl oder ein externes Programm sein
  3. 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

# Beende den ping-Befehl nach 5 Sekunden
timeout 5s ping example.com

# Beende die Skriptausführung nach 1 Minute
timeout 1m ./long_script.sh

Signaltyp angeben

Beispiel

# Sende INT-Signal nach 3 Sekunden (entspricht Strg+C)
timeout -s INT 3s command

# Sende KILL-Signal nach 10 Sekunden (erzwungene Beendigung)
timeout -s KILL 10s command

Kombinierte Verwendung

Beispiel

# Zuerst TERM-Signal senden, dann nach 5 Sekunden KILL-Signal senden
timeout -k 5s 10s command

Exit-Status ermitteln

Beispiel

# Exit-Status des beendeten Befehls beibehalten
timeout --preserve-status 5s command
echo $?  # Exit-Statuscode anzeigen

Praktische Anwendungsszenarien

1. Unendliche Skriptausführung verhindern

Beispiel

# Begrenze die Laufzeit des Datenbank-Backup-Skripts auf höchstens 2 Stunden
timeout 2h ./backup_database.sh

2. Timeout-Steuerung in automatisierten Tests

Beispiel

# Den Testfall höchstens 30 Sekunden laufen lassen
timeout 30s ./run_test_case.sh

3. Timeout bei Netzwerkoperationen

Beispiel

# Versuche, die Datei höchstens 1 Minute herunterzuladen
timeout 1m wget http://example.com/large_file.zip

4. Umgang mit Timeouts bei interaktiven Programmen

Beispiel

# Dem Benutzer höchstens 10 Sekunden zum Eingeben einer Auswahl geben
timeout 10s read -p "Bitte geben Sie Ihre Auswahl ein: " choice

Hinweise

  1. 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
  2. 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 mitkilldem Befehl
  3. 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
  4. 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

# Bereinigungsoperationen nach einem Timeout ausführen
timeout 30s command || echo "Befehl hat das Zeitlimit überschritten, Bereinigung wird durchgeführt..."

2. Verwendung in Skripten

Beispiel

#!/bin/bash

if timeout 10s command; then
    echo "Befehl erfolgreich abgeschlossen"
else
    echo "Befehl hat Zeitüberschreitung oder ist fehlgeschlagen"
fi

3. Überwachung der Ressourcennutzung

Beispiel

# CPU-Zeit begrenzen (erfordert Kombination mit ulimit)
(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

timeout 5s slow_command
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:

  1. Die Programmausführungszeit steuern, um zu verhindern, dass Ressourcen über lange Zeiträume belegt werden
  2. Die Robustheit von Skripten verbessern und unendliches Warten vermeiden
  3. Timeout-Mechanismen in automatisierten Abläufen implementieren
  4. 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.


Linux 命令大全Linux-Befehlsreferenz

Andere Erweiterungen