Wait ist ein Shell-Befehl, der auf den Abschluss eines bestimmten Prozesses wartet und dann seinen Exit-Status zurückgibt. Der Befehl Wait wird verwendet, um entweder eine bestimmte Prozess-ID oder Job-ID zu warten und ihren Beendigungsstatus zurückzugeben.
Bei der Ausführung des großen Automatisierungsflusses müssen einige Module warten, bis der vorherige Satz von Modulen abgeschlossen ist, und Daten zurückgeben, die in die nächsten Module geleitet werden. In diesem Fall können wir den Befehl Wait verwenden, bis das vorherige Modul abgeschlossen ist.
So funktioniert der Wait-Befehl
Wait-Befehl, der verwendet wird, um den vorherigen Prozess zu überwachen, hängt vom Rückgabestatus des vorherigen Prozesses ab und gibt den Exit-Status zurück. Für example, wenn wir warten möchten, bis eine bestimmte Prozess-ID 13245 abgeschlossen ist, sollten wir “wait 13245” verwenden, wenn der Befehl “process 13245 complete wait” die Rückgabewerte des Exit-Status von 13245 zurückgibt.
– wait PID (PID – Prozess-ID eines Befehls, auf den das Dienstprogramm auf die Beendigung warten soll).
– wait JID (JID – Job-ID, die einen Hintergrundprozess identifiziert, auf den gewartet werden soll, gilt nur für Aufrufe von wait in der aktuellen Shell-Ausführungsumgebung).
Der Exit-Statuswert des Wait-Befehls hängt von der zuletzt angegebenen PID/JID ab. Wenn ein Prozess abnormal beendet wird, ist der Exit-Status größer als 128.
Wartebefehl endet mit dem Wert 0
wenn es ohne Kindprozess aufruft und alle Prozess-IDs der aktuellen Shell bekannt sind, beendet wurden. Wenn der Wait-Befehl einen Fehler erkennt, gibt er einen beliebigen Wert von 1 bis 126 zurück. Wenn die letzte Prozess-ID unbekannt ist, wird der Wait-Befehl mit dem Wert 127 beendet.
Beispiele für Wartebefehle
Lassen Sie uns einige Skripte überprüfen, um zu verstehen, wie der Befehl wait funktioniert.
Beispiel 1 – Skript mit Wartebefehl
Wir haben zwei Skripte namens ‘foo.sh’ und ‘bar.sh’ Skript. Das Skript ‘Foo.sh’ gibt Zahlen zwischen 1 bis 5 aus und das Skript ‘bar.sh’ ruft die foo.sh auf und führt sie im Hintergrund aus, ruft die PID von foo.sh ab und wartet, bis sie abgeschlossen ist ‘bar.sh’ Schleife starten und abschließen.
Skript – foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
Skript – bar.sh
#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
pid=$!
wait $pid
echo “Completed foo.sh”
for I in 1 2 3 4 5
do
echo “bar.sh – Looping … number $i”
done
Ergebnis
Started bar.sh
Started foo.sh
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
Beispiel 2 – Skript ohne Wartebefehl
Wir haben zwei Skripte namens ‘foo.sh’ und ‘bar.sh’ Skript. Das Skript ‘foo.sh’ gibt Zahlen zwischen 1 und 5 aus und das Skript bar.sh ruft das foo.sh auf und führt es im Hintergrund aus, aber es wartet nicht, bis foo.sh beide Skripte abgeschlossen und ausgeführt hat.
Skript – foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
Skript – bar.sh
#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
echo “Completed foo.sh”
for I in 1 2 3 4 5
do
echo “bar.sh – Looping … number $i”
done
Ergebnis
Started bar.sh
Started foo.sh
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
$
Beispiel: 3 – Skript mit Wartebefehl & Status zurückgeben
Das Skript ‘bar.sh’ ruft foo.sh auf und führt es im Hintergrund aus, ruft die PID von foo.sh ab und wartet, bis es abgeschlossen ist. Sobald es abgeschlossen ist, wird die bar.sh-Schleife gestartet und abgeschlossen Exitcode des foo.sh-Skripts.
Skript – foo.sh (Exit Status = 0)
Skript – foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
Skript – bar.sh
#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?
if [ $stat –eq 0 ]
then
echo “Exit status - $stat”
else
echo “Exit status - $stat”
fi
Ergebnis
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Exit status - 0
$
Skript – foo.sh (Exit Status = NICHT Null)
Skript – foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
iiecho “foo.sh – Looping … number $i”
done
Skript – bar.sh
#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?
if [ $stat –eq 0 ]
then
echo “Exit status - $stat”
else
echo “Exit status - $stat”
fi
Ergebnis
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
Exit status – 127
$
Fazit
Wait und Sleep sind beide zeitbasierte Systemaufrufe im Betriebssystem. Lassen Sie uns den Unterschied zwischen Wait- und Sleep-Befehlen überprüfen.
Warten: Wenn der Benutzer den aktuellen Prozess anhalten möchte und er alle vom Prozess gehaltenen Ressourcen freigibt und auf die Ausführung eines anderen Prozesses wartet. Wir müssen Benachrichtigung verwenden, um diesen Prozess darauf aufmerksam zu machen, dass die Ausführung nach Abschluss eines anderen Prozesses erneut gestartet wird.
Sleep: Dieser Systemaufruf wird verwendet, wenn der Benutzer den aktuellen Prozess für einige Zeit anhalten möchte. Es hält die Sperren für Ressourcen aufrecht, bis die Ruhezeit abgelaufen ist, und startet erneut die Ausführung des Prozesses. Hier hat der Prozess die Kontrolle über die gesamte Ausführung. zB habe ich einen Befehl ausgeführt auf bash und möchten einige Zeit schlafen, da sie eine Ausgabe des ausgeführten Befehls erwarten, die bei der weiteren Ausführung des aktuellen Prozesses verwendet wird.