So verwenden Sie den Timeout-Befehl unter Linux

OK, das ist genug Computerzeit. Mit dem Befehl timeout können Sie Prozessen Zeitlimits zuweisen, indem Sie eine maximale Zeit festlegen, für die sie ausgeführt werden können. Hier ist ein Tutorial, wie Sie die Ausführung von Programmen mit diesem Befehl einschränken können.

Was bedeutet Timeout für Sie?

Mit dem Timeout-Befehl können Sie begrenzen Sie die Zeitdauer ein Programm läuft für. Aber warum willst du das tun?

Ein Fall ist, wenn Sie genau wissen, wie lange ein Prozess laufen soll. Ein häufiger Anwendungsfall ist die Timeout-Steuerung eines Protokollierungs- oder Datenerfassungsprogramms, damit die Protokolldateien nicht unerbittlich Ihren Festplattenspeicher verschlingen.

Ein anderer Fall ist, wenn Sie nicht wissen, wie lange ein Prozess ausgeführt werden soll, aber Sie wissen, dass er nicht auf unbestimmte Zeit ausgeführt werden soll. Möglicherweise haben Sie die Angewohnheit, Prozesse auszuführen, das Terminalfenster zu minimieren und sie zu vergessen.

Einige Programme – sogar einfache Dienstprogramme – können Netzwerkverkehr auf einem Niveau erzeugen, das die Leistung Ihres Netzwerks beeinträchtigen kann. Oder sie binden die Ressourcen auf einem Zielgerät und verlangsamen dessen Leistung. (Ping, ich sehe dich an.) Diese Art von Programmen für längere Zeit laufen zu lassen, während du nicht an deinem Computer bist, ist eine schlechte Praxis.

Auszeit ist Teil des GNU Core Utils Linux und Unix-ähnliche Betriebssysteme wie macOS haben alle Timeouts direkt integriert. Es gibt nichts zu installieren; Sie können es direkt aus der Box verwenden.

Erste Schritte mit Timeout

Hier ist ein einfaches Beispiel. Mit seinen standardmäßigen Befehlszeilenoptionen wird der Ping-Befehl beispielsweise ausgeführt, bis Sie ihn durch Drücken von Strg+C stoppen. Wenn Sie es nicht unterbrechen, geht es einfach weiter.

ping 192.168.4.28

Durch die Verwendung von Timeout können wir sicherstellen, dass Ping nicht ständig ausgeführt wird, die Netzwerkbandbreite auffrisst und jedes Gerät, das gepingt wird, belästigt.

Dieser nächste Befehl verwendet Timeout, um Ping zeitlich zu begrenzen. Wir erlauben 15 Sekunden Laufzeit für Ping.

timeout 15 ping 192.168.4.28

Nach 15 Sekunden Zeitüberschreitung beendet die Ping-Sitzung und wir kehren zur Befehlszeilen-Eingabeaufforderung zurück.

Timeout mit anderen Zeiteinheiten verwenden

Beachten Sie, dass wir hinter der 15. Zeitüberschreitung kein „s“ hinzufügen mussten, wenn der Wert in Sekunden angegeben wird. Sie könnten ein „s“ hinzufügen, aber es macht wirklich keinen Unterschied.

  So sichern Sie ein Ghost-Blog unter Linux

Um einen in Minuten, Stunden oder Tagen gemessenen Zeitwert zu verwenden, fügen Sie ein „m“, ein „h“ oder ein „d“ hinzu.

Um den Ping drei Minuten lang laufen zu lassen, verwenden Sie den folgenden Befehl:

timeout 3m ping 192.168.4.28

Ping wird drei Minuten lang ausgeführt, bevor die Zeitüberschreitung eintritt und die Ping-Sitzung anhält.

Einschränken der Datenerfassung mit Timeout

Einige Datenerfassungsdateien können sehr schnell groß werden. Um zu verhindern, dass solche Dateien unhandlich oder sogar problematisch werden, begrenzen Sie die Zeit, die das Capture-Programm ausführen darf.

In diesem Beispiel verwenden wir tcpdump, a Netzwerkverkehr erfassen Werkzeug. Auf den Testmaschinen, auf denen dieser Artikel recherchiert wurde, war tcpdump bereits in Ubuntu Linux und Fedora Linux installiert. Es musste auf Manjaro Linux und Arch Linux mit dem folgenden Befehl installiert werden:

sudo pacman -Syu tcpdump

Wir können tcpdump 10 Sekunden lang mit seinen Standardoptionen ausführen und die Ausgabe mit dem folgenden Befehl in eine Datei namens capture.txt umleiten:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump > capture.txt in einem Terminalfenster“ width=“646″ height=“77″ onload=“pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);“  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(tcpdump hat seine eigenen Optionen, um den erfassten Netzwerkverkehr in einer Datei zu speichern. Dies ist ein schneller Hack, weil wir‘ Wir besprechen Timeout, nicht tcpdump.)</p>
<p>tcpdump beginnt mit der Erfassung des Netzwerkverkehrs und wir warten 10 Sekunden.  Und 10 Sekunden kommen und gehen und tcpdump läuft immer noch, und capture.txt wird immer noch größer.  Um tcpdump anzuhalten, brauchen Sie ein schnelles Strg+C.</p>
<p>Die Überprüfung der Größe der capture.txt mit ls zeigt, dass sie innerhalb von Sekunden auf 209K angewachsen ist.  Diese Datei wuchs schnell!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

Was ist passiert? Warum hat Timeout tcpdump nicht gestoppt?

Es hat alles mit Signalen zu tun.

Das richtige Signal senden

Wenn Timeout ein Programm stoppen möchte, sendet es die SIGTERM-Signal. Dies fordert das Programm höflich auf, sich zu beenden. Einige Programme können das SIGTERM-Signal ignorieren. Wenn das passiert, müssen wir Timeout etwas stärker angeben.

  So löschen Sie Linux LVM-Volumes

Wir können dies tun, indem wir nach einer Zeitüberschreitung fragen, um stattdessen das SIGKILL-Signal zu senden.

Das SIGKILL-Signal kann nicht „abgefangen, blockiert oder ignoriert“ werden – es kommt immer durch. SIGKILL fordert das Programm nicht höflich auf, zu stoppen. SIGKILL versteckt sich mit Stoppuhr und Cosh um die Ecke.

Wir können die Option -s (signal) verwenden, um Timeout mitzuteilen, dass das SIGKILL-Signal gesendet wird.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump > capture.txt in einem Terminalfenster“ width=“646″ height=“167″ onload=“pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);“  onerror=“this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);“></p>
<p>Dieses Mal wird tcpdump nach Ablauf von 10 Sekunden beendet.</p>
<p>< img src=

Zuerst höflich fragen

Wir können Timeout anfordern, um zu versuchen, das Programm mit SIGTERM zu stoppen und SIGKILL nur einzusenden, wenn SIGTERM nicht funktioniert hat.

Dazu verwenden wir die Option -k (kill after). Die Option -k erfordert einen Zeitwert als Parameter.

In diesem Befehl bitten wir um Timeout, um dmesg 30 Sekunden lang laufen zu lassen und es dann mit dem SIGTERM-Signal zu beenden. Wenn dmesg nach 40 Sekunden immer noch läuft, bedeutet dies, dass das diplomatische SIGTERM ignoriert wurde und der Timeout SIGKILL senden sollte, um den Job zu beenden.

dmesg ist ein Dienstprogramm, das Überwachen Sie die Kernel-Ringpuffernachrichten und zeigen Sie sie in einem Terminalfenster an.

timeout -k 40 30 dmseg -w

dmesg läuft 30 Sekunden lang und stoppt, wenn es das SIGTERM-Signal empfängt.

Wir wissen, dass es nicht SIGKILL war, der dmesg gestoppt hat, denn SIGKILL hinterlässt immer einen Nachruf mit einem Wort im Terminalfenster: „Killed“. Das ist in diesem Fall nicht passiert.

Den Exit-Code des Programms abrufen

Gut erzogene Programme geben beim Beenden einen Wert an die Shell zurück. Dies wird als Exit-Code bezeichnet. Normalerweise wird dies verwendet, um der Shell – oder dem anderen Prozess, der das Programm gestartet hat – mitzuteilen, ob das Programm während der Ausführung auf Probleme gestoßen ist.

timeout stellt seinen eigenen Exit-Code bereit, aber das ist uns möglicherweise egal. Wir interessieren uns wahrscheinlich mehr für den Exit-Code des Prozesses, den die Zeitüberschreitung steuert.

Dieser Befehl lässt Ping fünf Sekunden lang laufen. Es pingt einen Computer namens Nostromo an, der sich im Testnetzwerk befindet, mit dem dieser Artikel recherchiert wurde.

timeout 5 ping Nostromo.local

Der Befehl wird fünf Sekunden lang ausgeführt und durch Timeout beendet. Wir können dann den Exit-Code mit diesem Befehl überprüfen:

echo $?

Der Exit-Code ist 124. Dies ist der Wert, den Timeout verwendet, um anzuzeigen, dass das Programm mit SIGTERM beendet wurde. Wenn SIGKILL das Programm beendet, lautet der Exitcode 137.

  So richten Sie mit Next Cloud Ihren eigenen Cloud-Speicher unter Linux ein

Wenn wir das Programm mit Strg+C unterbrechen, ist der Exit-Code vom Timeout Null.

timeout 5 ping Nostromo.local
echo $?

Wenn die Ausführung des Programms endet, bevor timeout sie beendet, kann timeout den Exit-Code des Programms zurück an die Shell übergeben.

Dazu muss das Programm von selbst angehalten werden (also nicht durch Timeout beendet werden) und wir müssen die Option –preserve-status verwenden.

Wenn wir die Option -c (count) mit einem Wert von fünf verwenden, wird ping nur fünf Anfragen auslösen. Wenn wir dem Timeout eine Dauer von einer Minute geben, hat sich Ping definitiv von selbst beendet. Wir können dann den Exit-Wert mit echo überprüfen.

timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?

ping schließt seine fünf Ping-Anfragen ab und beendet sich. Der Exit-Code ist null.

Um zu überprüfen, ob der Exit-Code von Ping stammt, zwingen wir ping, einen anderen Exit-Code zu generieren. Wenn wir versuchen, Ping-Anfragen an eine nicht vorhandene IP-Adresse zu senden, schlägt der Ping mit einem Fehler-Exit-Code fehl. Wir können dann echo verwenden, um zu überprüfen, ob der Exit-Code ungleich Null ist.

timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

Der Ping-Befehl kann das nicht vorhandene Gerät offensichtlich nicht erreichen, also meldet er den Fehler und schließt sich. Der Exit-Code ist zwei. Dies ist der Exit-Code, den Ping für allgemeine Fehler verwendet.

Grundregeln festlegen

Bei timeout geht es darum, den laufenden Programmen einige Grenzen zu setzen. Wenn die Gefahr besteht, dass die Protokolldateien Ihre Festplatte überlaufen oder Sie vergessen, dass Sie ein Netzwerktool ausgeführt haben, setzen Sie sie in Timeout und lassen Sie Ihren Computer sich selbst regulieren.