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:
- Die erste Zeile heißt shebang und teilt dem Betriebssystem mit, welchen Interpreter es verwenden soll, um den Rest der Datei zu parsen.
- Wir verwenden den
sleep
Befehl, um einen zeitaufwändigen Hintergrundprozess zu emulieren. $!
ist eine interne Bash-Variable, die die PID des letzten im Hintergrund ausgeführten Jobs speichert. In diesem Beispiel ist das die PID vonsleep
Befehl. Wir speichern die PID in einer Variablen (process_id
).- Druckt die PID-Nummer.
- Die PID wird an
wait
übergeben Befehl, der bis zumsleep
wartet Befehl abgeschlossen. - 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.