Pausieren das Bash-Shell-Skript für X Sekunden

Niraj Menon 30 Januar 2023
  1. Pausieren das Bash-Skript für X Sekunden
  2. Pausieren Sie das Bash-Skript für einen variablen Zeitraum
  3. Bash-Skript anhalten, bis eine Benutzereingabe erfolgt
  4. Kombinieren Sie zeitgesteuerte Pausen mit vom Benutzer eingegebenen Pausen
Pausieren das Bash-Shell-Skript für X Sekunden

Bash-Skripte sind ziemlich nützlich, um mehrere Befehle auszuführen, die Sie möglicherweise nicht Zeile für Zeile in die Bash-Befehlsshell eingeben müssen. In einigen Szenarien müssen Sie Ihr Skript möglicherweise anhalten, möglicherweise um Eingaben von einem Benutzer zu akzeptieren, oder in den Ruhezustand wechseln, bis das Ergebnis eines Befehls zurückgegeben wurde.

In diesem Tutorial werden die verschiedenen Möglichkeiten zum Anhalten Ihres Bash-Shell-Skripts erläutert.

Pausieren das Bash-Skript für X Sekunden

Angenommen, Sie schreiben Ihr Skript von Grund auf neu und entscheiden, dass Sie potenziellen Benutzern eine Willkommensnachricht anzeigen möchten, sodass Sie das Starten des Skripts verzögern müssen, damit Ihre Benutzer die Nachricht lesen können, die erklärt, was Ihr Skript vorher tun wird Es beginnt mit der Ausführung weiterer Bash-Befehle. Der Befehl sleep in Bash kann Ihnen dabei helfen, detailliert hier. Seine Syntax ist wie folgt:

sleep n

Wobei n die Anzahl der Sekunden ist, die Sie warten möchten. n kann auch in kleineren Einheiten wie Millisekunden angegeben werden, indem Sie die Zahl einfach als Dezimalzahl angeben. Wenn Sie also 30 Millisekunden pausieren möchten, sollte sleep 0.030 ausreichen!

Denken Sie daran, dass n ein obligatorisches Argument ist, also würde es nicht ganz funktionieren, sleep nicht zu sagen, wie lange es laufen soll. Das Ausführen ohne einen Wert für n würde den folgenden Fehler erzeugen.

user@linux:~$ sleep
sleep: missing operand
Try 'sleep --help' for more information.

Wenn Sie viel länger als nur Sekunden warten möchten, akzeptiert sleep auch Argumente, die die Zeiteinheit angeben (dh Minuten, Stunden, Tage), wenn Sie also eine ganze Woche warten möchten, ist sleep 7d Ihre Lösung!

Hier sind einige Anwendungsfälle für sleep.

# wait 500 milliseconds
sleep 0.5
# wait 1 second
sleep 1
# wait 20 seconds
sleep 20

So zeigen Sie eine Nachricht an und warten 1 Minute:

echo "Hello!  This script will run in exactly a minute!"
sleep 1m

Um ein Skript erneut auszuführen, um langlaufende Python-Prozesse jede Woche zu beenden.

while true
do
    killall --older-than 7d python3
    sleep 7d
done

Pausieren Sie das Bash-Skript für einen variablen Zeitraum

In einigen Fällen möchten Sie unterschiedlich lange warten, wahrscheinlich weil Sie das Skript mit unterschiedlichen Verzögerungen ausführen möchten, je nachdem, wie viele Skripts ausgeführt werden. Ein gutes Beispiel ist, wenn Sie dasselbe Skript mehrmals ausführen, das möglicherweise dieselbe Datei ändern muss, benötigt jeder Aufruf des Skripts eine andere Verzögerung, um sicherzustellen, dass nicht zwei Aufrufe die Datei gleichzeitig ändern.

In diesem Fall könnten Sie aus n eine echte Variable im Bash-Stil machen, $N, und ihren Wert irgendwann im Skript festlegen. Ein Beispiel ist wie folgt:

N=5
sleep $N

Das Skript, in das dies eingefügt wird, sollte 5 Sekunden lang schlafen.

Wenn Sie die Initialisierung für $N weglassen und stattdessen den Wert beim Aufrufen des Skripts angeben, können Sie den in der Shell-Umgebung definierten Wert von N verwenden, um dem Skript die sleep-Zeitspanne bereitzustellen.

user@linux:~$ cat test.sh
#! /bin/bash
sleep $N
user@linux:~$ export N=3
user@linux:~$ chmod +x test.sh
user@linux:~$ ./test.sh

Als Ergebnis sollte das Skript 3 Sekunden lang ausgeführt werden. Sie können sogar den Umgebungswert überschreiben und ihn im Skriptaufruf angeben, indem Sie N=2 ./test.sh ausführen.

Sie können sogar erwägen, die Verzögerung zufällig zu bestimmen, indem Sie stattdessen $RANDOM als Argument für sleep verwenden – Sie können also sleep $RANDOM sagen.

Wenn Ihnen der Wertebereich von $RANDOM zu groß ist, sollten Sie durch Anwenden einer Modulo-Operation mit einem optionalen zusätzlichen Wert, um eine minimale Verzögerung sicherzustellen, einige Sekunden lang schlafen können. Um beispielsweise für eine bestimmte Zeit zwischen 10 und 30 Sekunden zu schlafen, könnten Sie Folgendes tun:

sleep $((10 + RANDOM % 21))

Bash-Skript anhalten, bis eine Benutzereingabe erfolgt

Manchmal reicht es nicht aus, eine bestimmte Zeit zu warten - Sie möchten vielleicht sicherstellen, dass der Benutzer Ihre Willkommensnachricht gelesen hat und/oder bereit ist, mit der Ausführung Ihres Skripts zu beginnen. In diesem Fall möchten Sie warten, bis sie etwas eingeben, um anzuzeigen, dass sie bereit sind zu beginnen.

Dazu verwenden wir den Befehl read, der hier ausführlich beschrieben wird. read wartet auf die Eingabe von Daten über die Standardeingabe - die Befehlszeile, in die Sie Befehle eingeben, könnte als Standardeingabe bezeichnet werden - und ein abschließender Enter-Tastendruck signalisiert dem Befehl, dass die Daten eingegeben wurden. Die Zeichenfolge kann dann in eine Variable eingefügt oder einfach ignoriert werden, was der Anwendungsfall ist, den wir hier betrachten werden.

Der einfachste Aufruf von read erfordert keine Argumente:

read 

Es sollte eine neue Zeile gedruckt werden, in die Sie etwas eingeben. Wenn Sie die Eingabetaste drücken, sollten Sie zur Bash-Eingabeaufforderung zurückkehren, unabhängig davon, was Sie zuvor eingegeben haben.

Kombinieren Sie zeitgesteuerte Pausen mit vom Benutzer eingegebenen Pausen

Ein ausgezeichneter Anwendungsfall, bei dem Sie zeitgesteuerte Pausen mit Benutzereingabepausen kombinieren müssten, besteht darin, sicherzustellen, dass Ihr Skript weiter ausgeführt werden soll, wenn der Benutzer nicht antwortet, und es für ihn nicht wichtig ist, dies zu tun. Der read-Befehl ermöglicht uns dies durch die Angabe eines -t-Parameters, der mehrere Sekunden dauert, bis der Befehl wartet, bevor er abläuft, wenn die Enter-Taste nicht gedrückt wird. Es würde wie folgt verwendet werden.

read -t 5

Infolgedessen wird read beendet, wenn die Eingabetaste gedrückt wird oder wenn 5 Sekunden vergehen, je nachdem, was zuerst eintritt.

Ein anderer Anwendungsfall wäre das Warten für eine bestimmte Zeit, die vom Benutzer selbst angegeben wird. In diesem Fall könnten Sie warten, bis der Benutzer einen ganzzahligen Wert eingibt, und ihn dann wie folgt als Argument an sleep übergeben.

echo -n "Enter time to sleep: "
read $time
sleep $time

Dies setzt natürlich voraus, dass der Benutzer ein gültiges Argument für sleep eingibt.

Fassen wir mit einigen Beispielen zusammen!

  • sleep 3 pausiert ein Skript für genau 3 Sekunden.
  • sleep 3d pausiert ein Skript für genau 3 Tage.
  • sleep $N hält ein Skript für die als $N angegebene Anzahl von Sekunden an.
  • sleep $((10 + RANDOM % 21)) wird für eine zufällige Zeitspanne innerhalb von 10-30 Sekunden schlafen.
  • read wartet darauf, dass der Benutzer etwas eingibt.
  • read -t 3 wartet darauf, dass der Benutzer etwas eingibt, läuft aber nach 3 Sekunden ab, wenn die Eingabetaste nie gedrückt wird.
  • read $time && sleep $time nimmt ein String-Argument vom Benutzer und verwendet es als Argument für sleep, wodurch der Benutzer angeben kann, wie lange er schlafen möchte.