So verwenden Sie den Timeout-Befehl unter Linux

Inhalt

Linux-Laptop mit einer Bash-Eingabeaufforderung

Zustimmen, genug Zeit am Computer. Sie können Prozesse zeitlich begrenzen, Festlegung einer maximalen Zeit, die mit der ausgeführt werden kann timeoutBefehl. Hier ist ein Tutorial, um die Ausführung von Programmen mit diesem Befehl einzuschränken.

Was bringt dir die Wartezeit?

das timeout der Befehl ermöglicht es Ihnen Setzen Sie eine zeitliche Begrenzung ein Programm wird ausgeführt. Aber, Warum willst du das tun?

Ein Fall ist, wenn Sie genau wissen, wie lange ein Verfahren dauern soll. Ein häufiger Anwendungsfall ist zu haben timeout Steuern Sie ein Protokollierungs- oder Datenerfassungsprogramm, damit Protokolldateien Ihren Festplattenspeicher nicht unerbittlich verbrauchen.

Ein anderer Fall ist, wenn Sie nicht wissen, wie lange ein Verfahren laufen soll, aber du weißt, dass du es nicht auf unbestimmte Zeit laufen lassen willst. Möglicherweise haben Sie die Angewohnheit, laufende Prozesse zu konfigurieren, Terminalfenster minimieren und vergessen.

Einige Programme, sogar einfache Dienstprogramme, kann Netzwerkverkehr auf einem Niveau erzeugen, das die Leistung Ihres Netzwerks beeinträchtigen kann. Oder sie können Ressourcen auf einem Zielgerät einfrieren, was deine Leistung verlangsamt. (ping, Ich schaue dich an.) Es ist eine schlechte Praxis, diese Art von Programmen für längere Zeit laufen zu lassen, während Sie nicht an Ihrem Computer sitzen..

timeout ist ein Teil von GNU-Kern-Dienstprogramme da, Linux- und Unix-ähnliche Betriebssysteme, wie macOS, haben eine eingebaute Wartezeit. Es gibt nichts zu installieren; Sie können es direkt aus der Box verwenden.

Beginnend mit der Wartezeit

Hier ist ein einfaches Beispiel. Als Beispiel, mit Ihren Standard-Befehlszeilenoptionen, das ping Der Befehl wird ausgeführt, bis Sie ihn durch Drücken von Strg . stoppen + C. Wenn du nicht unterbrichst, Fortsetzung folgt.

Klingeln 192.168.4.28

Durch Nutzung timeout, wir können sicher gehen ping läuft nicht zeitweilig, auf der Netzwerkbandbreite herumkauen und jedes Gerät belästigen, das gepingt wird.

Dieser nächste Befehl verwendet timeout bis zur frist ping. Wir erlauben 15 Laufzeit Sekunden für ping.

Auszeit 15 Klingeln 192.168.4.28

Nach 15 Sekunden timeout beendet die ping Sitzung und kehren Sie zur Befehlszeile zurück.

Timeout mit anderen Zeiteinheiten verwenden

Beachten Sie, dass wir a . nicht hinzufügen mussten “S” hinter 15. timeout geht davon aus, dass der Wert in Sekunden angegeben ist. Könnte hinzufügen a “S”, aber es macht wirklich keinen Unterschied.

So verwenden Sie einen in Minuten gemessenen Zeitwert, Stunden oder Tage, füge hinzu ein “m”, ein “h” oder eins “D”.

Damit der Ping drei Minuten lang läuft, benutze den folgenden Befehl:

Zeitüberschreitung 3m Ping 192.168.4.28

ping funktioniert drei Minuten vorher timeout greift ein und stoppt die ping Sitzung.

Ping-Sitzung, die auf einem verwitweten Terminal ausgeführt wird

Datenerfassung mit Timeout begrenzen

Einige Datenerfassungsdateien können sehr schnell wachsen. Um zu verhindern, dass solche Dateien unhandlich oder sogar problematisch in der Größe werden, Begrenzen Sie die Zeit, die das Capture-Programm ausgeführt werden darf.

In diesem Beispiel, wir benutzen tcpdump, ein Netzwerkverkehr erfassen Werkzeug. Auf den Testmaschinen wurde dieser Beitrag untersucht, tcpdump es war bereits auf Ubuntu Linux und Fedora Linux installiert. Es musste auf Manjaro Linux und Arch Linux installiert werden, mit folgendem Befehl:

sudo pacman -Syu tcpdump

Wir können laufen tcpdump während 10 Sekunden mit Ihren Standardoptionen und leiten Sie Ihre Ausgabe mit dem folgenden Befehl in eine Datei namens capture.txt um:

Auszeit 10 sudo tcpdump > capture.txt

(tcpdump hat seine eigenen Optionen zum Speichern des erfassten Netzwerkverkehrs in einer Datei. Dies ist ein schneller Hack, weil wir diskutieren timeout, Nein tcpdump.)

tcpdump beginnt mit der Erfassung des Netzwerkverkehrs und wir warten 10 Sekunden. UND 10 Sekunden kommen und gehen und tcpdump läuft noch und capture.txt wird immer größer. Eine Strg wird benötigt + C hastig zu stoppen tcpdump.

Überprüfen der Größe von capture.txt mit ls zeigt, dass es in Sekunden auf 209.000 angewachsen ist. Diese Datei wuchs schnell!

ls -lh capture.txt

Was ist passiert? Warum nicht timeout halt tcpdump?

Es hat alles mit den Schildern zu tun.

Senden Sie das richtige Signal

Wann timeout möchte ein Programm stoppen, sendet die Signal SIGTERM. Hiermit wird höflich gebeten, die Show zu beenden. Einige Programme können das SIGTERM-Signal ignorieren.. Wenn das passiert, wir müssen sagen timeout etwas energischer sein.

Wir können das tun, indem wir fragen timeout um stattdessen das SIGKILL-Signal zu senden.

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

Wir können die nutzen -s (Unterschrift) Möglichkeit zu zählen timeout um das SIGKILL-Signal zu senden.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

Diesmal, sobald sie abgelaufen sind 10 Sekunden, tcpdump ist gestoppt.

Erst höflich fragen

Wir können fragen timeout um zu versuchen, das Programm mit SIGTERM . zu stoppen, und sende nur SIGKILL, wenn SIGTERM nicht funktioniert hat.

Um dies zu tun, wir nehmen das -k (später töten) Möglichkeit. das -k Die Option benötigt einen Zeitwert als Parameter.

In diesem Befehl, wir fragen timeout Lassen dmesg laufen für 30 Sekunden und dann mit dem SIGTERM-Signal beenden. Und dmesg funktioniert auch danach noch 40 Sekunden, bedeutet, dass das diplomatische SIGTERM ignoriert wurde und timeout Sie müssen SIGKILL senden, um den Job zu beenden.

dmesg ist ein Dienstprogramm, das Kernel-Ringpuffernachrichten überwachen und in einem Terminalfenster anzeigen.

Zeitüberschreitung -k 40 30 dmseg -w

dmesg funktioniert für 30 Sekunden und stoppt, wenn es das SIGTERM-Signal empfängt.

Wir wissen, dass es nicht SIGKILL war, der aufgehört hat dmesg denn SIGKILL hinterlässt immer einen Ein-Wort-Nachruf im Terminalfenster: “Ermordet”. Das ist in diesem Fall nicht passiert.

Rufen Sie den Programm-Exit-Code ab

Gut erzogene Programme geben einen Wert an die Shell zurück, wenn sie fertig sind. Dies wird als Exit-Code bezeichnet.. Im Allgemeinen, Dies wird verwendet, um die Shell zu sagen, oder jede Prozedur, die das Programm gestartet hat, wenn das Programm während der Ausführung auf Probleme gestoßen ist.

timeout Geben Sie Ihren eigenen Exit-Code an, aber es ist möglich, dass uns das egal ist. Uns interessiert wahrscheinlich mehr der Exit-Code des Verfahrens als timeout kontrolliert.

Dieser Befehl aktiviert ping fünf Sekunden laufen. Sie pingen einen Computer namens Nostromo, das ist im Testnet, das verwendet wurde, um diesen Beitrag zu recherchieren.

Auszeit 5 ping Nostromo.local

Der Befehl wird fünf Sekunden lang ausgeführt und timeout Beende es. Dann können wir den Exit-Code mit diesem Befehl überprüfen:

Echo $?

Der Exit-Code lautet 124. Das ist der Wert timeout Wird verwendet, um anzuzeigen, dass das Programm mit SIGTERM . beendet wurde. Wenn SIGKILL das Programm beendet, der Exit-Code ist 137.

Wenn wir das Programm mit Strg . unterbrechen + C der Exit-Code von timeout ist null.

Auszeit 5 ping Nostromo.local
Echo $?

Wenn die Programmausführung endet Vor timeout Beende es, timeout Sie können den Exit-Code des Programms an die Shell übergeben.

Damit das passiert, das Programm sollte von selbst stoppen (Mit anderen Worten, es ist Nein fertig von timeout), und wir müssen die nutzen --preserve-status Möglichkeit.

Wenn wir die verwenden -c (zählen) Option mit einem Wert von fünf ping löst nur fünf Anfragen aus. Wenn wir geben timeout eine einminütige Verlängerung, ping geht bestimmt von alleine vorbei. Dann können wir den Ausgabewert mit überprüfen echo.

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 . stammt ping, lass uns erzwingen ping um einen anderen Exit-Code zu generieren. Wenn wir versuchen, Ping-Anfragen an eine nicht vorhandene IP-Adresse zu senden, ping wird mit einem Fehler-Exit-Code fehlschlagen. Dann können wir verwenden echo um zu überprüfen, ob der Exit-Code ungleich Null ist.

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

das ping offensichtlich, Befehl kann nicht vorhandenes Gerät nicht erreichen, Also meldet es den Fehler und schließt sich. Der Exit-Code ist zwei. Das ist der Exit-Code ping verwendet für allgemeine Fehler.

Grundregeln festlegen

timeout Es geht darum, dem Ausführen von Programmen einige Grenzen zu setzen. Wenn die Gefahr besteht, dass Protokolldateien in Ihre Festplatte eindringen oder vergessen, dass Sie ein Netzwerktool ausgeführt haben, wickle sie ein timeout und lass deinen Computer sich selbst regulieren.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.