warten
ist ein Befehl, der auf den Abschluss der angegebenen Jobs wartet und den Exit-Status des gewarteten Befehls zurückgibt.
Seit der warten
Der Befehl wirkt sich auf die aktuelle Shell-Ausführungsumgebung aus, er ist in den meisten Shells als integrierter Befehl implementiert.
In diesem Artikel untersuchen wir die integrierte Bash-Funktion warten
Befehl.
Bash warten
Befehl #
Die allgemeine Syntax des warten
eingebaut hat die folgende Form:
warten [Optionen] ID
ICH WÜRDE
ist die Prozess- oder Job-ID. Wenn nein ICH WÜRDE
angegeben ist, wartet der Befehl, bis alle untergeordneten Hintergrundjobs abgeschlossen sind.
Das warten
Befehl gibt den Exit-Status des letzten Befehls zurück, auf den gewartet wurde.
Zum Beispiel, um mit PID auf einen Hintergrundprozess zu warten 7654
, du würdest verwenden:
warte 7654
Wenn mehrere Prozesse angegeben werden, wartet der Befehl, bis alle Prozesse abgeschlossen sind.
Jobs werden mithilfe der Jobspezifikation („jobspec“) spezifiziert, die eine Möglichkeit ist, auf die Prozesse zu verweisen, aus denen der Job besteht. Eine Jobspezifikation beginnt mit einem Prozentsymbol 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 Auftrag zu warten, führen Sie die warten
Befehl gefolgt von der Stellenbeschreibung:
warte %2
Bei Aufruf mit dem -nein
Option wartet der Befehl nur auf den Abschluss eines einzelnen Jobs aus den angegebenen Pids oder Jobspezifikationen und gibt seinen Exit-Status zurück. Wenn keine Argumente angegeben werden, warte -n
wartet auf den Abschluss eines Hintergrundjobs und gibt den Job-Exit-Status zurück.
warte -n 45432 54346 76573
Im obigen Beispiel, warte -n
druckt nur den Rückgabestatus des Jobs, der zuerst beendet wird; es zeigt nicht die PID des Jobs an. Wenn Sie die Job-PID oder Jobspec abrufen möchten, für die der Exit-Status zurückgegeben wird, verwenden Sie die -p
Möglichkeit, es einer Variablen zuzuweisen:
warten -p job_id -n 45432 54346 76573
-p
Option wurde in Bash 5 eingeführt.1. Wenn Sie eine ältere Bash-Version verwenden, erhalten Sie die Fehlermeldung „Ungültige Option“.
Das -f
Option sagt warten
warten, bis jede pid oder jobspec tatsächlich beendet wird, bevor der Exit-Code zurückgegeben wird, anstatt zurückzukehren, wenn der Jobstatus geändert wird. Diese Option ist nur gültig, wenn die Jobsteuerung aktiviert ist. Standardmäßig ist die Auftragssteuerung nur für interaktive Eingabeaufforderungen aktiviert.
Beispiele #
warten
wird normalerweise in Shell-Skripten verwendet, die untergeordnete Prozesse erzeugen, die parallel ausgeführt werden.
Um die Funktionsweise des Befehls zu veranschaulichen, 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, welcher Interpreter zum Parsen des Rests der Datei verwendet werden soll.
- Wir verwenden die
schlafen
Befehl zum Emulieren eines zeitaufwendigen Hintergrundprozesses. $!
ist eine interne Bash-Variable, die die PID des letzten Joblaufs im Hintergrund speichert. In diesem Beispiel ist das die PID des ofschlafen
Befehl. Wir speichern die PID in einer Variablen (Prozess ID
).- Druckt die PID-Nummer.
- Die PID wird an die
warten
Befehl, der wartet, bis derschlafen
Befehl abgeschlossen. - Druckt den Ausgangsstatus des of
warten
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 in etwa wie folgt gedruckt:
PID: 36353 Ausgangsstatus: 0
Hier ein Beispiel mit dem -nein
Möglichkeit:
#!/bin/bash sleep 3 & sleep 30 & sleep 5 & wait -n echo "Erster Auftrag abgeschlossen." wait echo "Alle Jobs abgeschlossen."
Wenn das Skript ausgeführt wird, werden 3 Hintergrundprozesse erzeugt. warte -n
wartet, bis der erste Job abgeschlossen ist und die Echo-Anweisung gedruckt wird. warten
wartet, bis alle untergeordneten Hintergrundjobs abgeschlossen sind.
erster Auftrag erledigt alle Aufträge erledigt
Das letzte Beispiel erklärt die -f
Möglichkeit. Öffnen Sie das Terminal und führen Sie Folgendes aus:
Schlaf 3600 &
[1] 46671
Warten Sie auf den Vorgang:
warte 46671
Öffnen Sie ein anderes Terminal und stoppen Sie den Vorgang mit der töten
Befehl:
töten -STOP 46671
Sobald sich der Prozessstatus ändert, wird die warten
Befehl wird abgeschlossen und gibt den Prozess-Exit-Code zurück.
Wiederholen Sie nun die gleichen Schritte, verwenden Sie dieses Mal jedoch warte -f $pid
:
Schlaf 3600 &
warte -f 46671
Stoppen Sie den Vorgang vom anderen Terminal aus:
töten -STOP 46671
Diesmal die warten
Befehl wird nicht abgeschlossen. Es läuft bis zum schlafen
Prozess wird beendet.
Fazit #
Das warten
Der Befehl wartet auf den Abschluss der angegebenen Jobs und gibt den Exit-Code des Jobs zurück.
Wenn Sie Fragen oder Feedback haben, können Sie gerne einen Kommentar hinterlassen.