GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Wartebefehl

wait ist ein Befehl, der auf den Abschluss der angegebenen Jobs wartet und den Exit-Status des gewarteten Befehls zurückgibt.

Seit dem wait Der Befehl wirkt sich auf die aktuelle Shell-Ausführungsumgebung aus, er ist in den meisten Shells als eingebauter Befehl implementiert.

In diesem Artikel untersuchen wir das in Bash integrierte wait Befehl.

Bash wait Befehl #

Die allgemeine Syntax des wait built-in hat folgende Form:

wait [options] ID

ID ist die Prozess- oder Job-ID. Wenn keine ID angegeben ist, wartet der Befehl, bis alle untergeordneten Hintergrundjobs abgeschlossen sind.

Das wait Befehl gibt den Exit-Status des letzten Befehls zurück, auf den gewartet wurde.

Zum Beispiel, um auf einen Hintergrundprozess mit PID 7654 zu warten , würden Sie verwenden:

wait 7654

Wenn mehrere Prozesse angegeben werden, wartet der Befehl darauf, dass alle Prozesse abgeschlossen sind.

Jobs werden mithilfe der Jobspezifikation („jobspec“) spezifiziert, was eine Möglichkeit ist, sich auf die Prozesse zu beziehen, aus denen sich der Job zusammensetzt. Eine Jobspezifikation beginnt mit einem Prozentzeichen gefolgt von der Jobnummer (%n ). Hier ist ein Beispiel:

Führen Sie einen Befehl im Hintergrund aus:

rsync -a /home /tmp/home &

Die Shell-Job-ID (in Klammern eingeschlossen) und die Prozess-ID werden auf Ihrem Terminal angezeigt:

[2] 54377

Um auf den Job zu warten, führen Sie wait aus Befehl gefolgt von der Jobspezifikation:

wait %2

Bei Aufruf mit -n Option wartet der Befehl nur auf den Abschluss eines einzelnen Jobs aus den angegebenen PIDs oder Jobspezifikationen und gibt seinen Beendigungsstatus zurück. Wenn keine Argumente angegeben werden, wait -n wartet auf den Abschluss eines beliebigen Hintergrundjobs und gibt den Job-Exit-Status zurück.

wait -n 45432 54346 76573

Im obigen Beispiel wait -n druckt nur den Rückgabestatus des Jobs, der zuerst beendet wird; es zeigt nicht die PID des Jobs. Wenn Sie die Job-PID oder Jobspezifikation erhalten möchten, für die der Exit-Status zurückgegeben wird, verwenden Sie -p Möglichkeit, es einer Variablen zuzuweisen:

wait -p job_id -n 45432 54346 76573

-p Option wurde in Bash 5.1 eingeführt. Wenn Sie eine ältere Bash-Version verwenden, erhalten Sie einen „ungültige Option“-Fehler.

Das -f Option sagt wait zu warten, bis jede PID oder Jobspezifikation tatsächlich beendet wird, bevor ihr Exit-Code zurückgegeben wird, anstatt zurückzukehren, wenn sich der Jobstatus ändert. Diese Option ist nur gültig, wenn die Jobsteuerung aktiviert ist. Standardmäßig ist die Auftragssteuerung nur für interaktive Eingabeaufforderungen aktiviert.

Beispiele #

wait wird normalerweise in Shell-Skripten verwendet, die untergeordnete Prozesse erzeugen, die parallel ausgeführt werden.

Um zu veranschaulichen, wie der Befehl funktioniert, erstellen Sie das folgende Skript:

#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"

Lassen Sie uns den Code Zeile für Zeile erklären:

  1. Die erste Zeile heißt shebang und teilt dem Betriebssystem mit, welchen Interpreter es verwenden soll, um den Rest der Datei zu parsen.
  2. Wir verwenden den sleep Befehl, um einen zeitaufwändigen Hintergrundprozess zu emulieren.
  3. $! ist eine interne Bash-Variable, die die PID des letzten im Hintergrund ausgeführten Jobs speichert. In diesem Beispiel ist das die PID von sleep Befehl. Wir speichern die PID in einer Variablen (process_id ).
  4. Druckt die PID-Nummer.
  5. Die PID wird an wait übergeben Befehl, der bis zum sleep wartet Befehl abgeschlossen.
  6. Druckt den Exit-Status von wait Befehl. $? ist eine interne Bash-Variable, die den Exit-Status des zuletzt ausgeführten Befehls enthält.

Wenn Sie das Skript ausführen, wird es etwa so ausgeben:

PID: 36353
Exit status: 0

Hier ein Beispiel mit dem -n Möglichkeit:

#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."

Wenn das Skript ausgeführt wird, erzeugt es 3 Hintergrundprozesse. wait -n wartet, bis der erste Auftrag abgeschlossen ist und die Echo-Anweisung gedruckt wird. wait wartet, bis alle untergeordneten Hintergrundjobs abgeschlossen sind.

first job completed
all jobs completed

Das letzte Beispiel erklärt das -f Möglichkeit. Öffnen Sie das Terminal und führen Sie Folgendes aus:

sleep 3600 &
[1] 46671

Warten Sie auf den Vorgang:

wait 46671

Öffnen Sie ein anderes Terminal und stoppen Sie den Vorgang mit kill Befehl:

kill -STOP 46671

Sobald der Prozessstatus geändert wird, wird das wait Der Befehl wird abgeschlossen und gibt den Exit-Code des Prozesses zurück.

Wiederholen Sie nun die gleichen Schritte, aber verwenden Sie dieses Mal wait -f $pid :

sleep 3600 &wait -f 46671

Stoppen Sie den Prozess vom anderen Terminal aus:

kill -STOP 46671

Diesmal das wait Befehl wird nicht abgeschlossen. Es läuft bis zum sleep Prozess wird beendet.

Schlussfolgerung #

Das wait Der Befehl wartet auf den Abschluss der angegebenen Jobs und gibt den Beendigungscode des Jobs zurück.


Linux
  1. Der „eval“-Befehl in Bash?

  2. apachectl von bash starten

  3. Bash:Warte mit Timeout

  4. Bash-Exportbefehl

  5. bash sh - Befehl nicht gefunden

Verlaufsbefehl in Linux (Bash-Verlauf)

Bash Exit-Befehl und Exit-Codes

Bash-printf-Befehl

Wartebefehl in Linux mit Beispielen

Bash-Skripting (II)

Bash-Scripting(III)