Bash-Wait-Befehl mit Beispielen

The wait command in Bash is a powerful tool for managing shell script processes. It is primarily used to pause the execution of a script until the specified background process has finished. This command is handy in scripts that initiate multiple background jobs and need to synchronize their completion before proceeding with further tasks. The wait command can be applied to individual process IDs (PIDs) or to wait for all background processes initiated by the current shell session. By using wait, you can ensure that your script only moves forward when specific tasks are fully completed, making your automation processes more reliable and efficient.

Dieses Handbuch bietet praktische Beispiele zur Verwendung des Wait-Befehls in verschiedenen Szenarien und hilft Ihnen zu verstehen, wie Sie Hintergrundprozesse in Ihren Bash-Skripten effektiv verwalten.

Den Bash-Befehl „wait“ verstehen

Der Wait-Befehl in Bash ist eine integrierte Funktion, die die Ausführung der aktuellen Shell anhält, bis die angegebenen Jobs abgeschlossen sind. Anschließend gibt er den Beendigungsstatus des Befehls zurück, auf den er gewartet hat. Dieser Befehl spielt eine entscheidende Rolle in der Shell-Ausführungsumgebung und ist daher in die meisten Shells integriert.

Die allgemeine Syntax des Wartebefehls lautet wie folgt:

wait [ID]

In this context, ID represents the process or job ID. If no ID is specified, the wait command will pause until all child background jobs have finished. The wait command returns the exit status of the last command it waited for.

Um beispielsweise einen Hintergrundprozess mit PID 7654 anzuhalten, verwenden Sie:

wait 7654

If multiple processes are specified, the wait command will pause until they have finished.

Navigieren in Job-Spezifikationen mit dem Bash-Wait-Befehl

Jobs are specified using the job specification (jobspec), which refers to the processes that make up the job. A jobspec begins with a percentage symbol followed by the job number (%n). Here is an example:

rsync -a /home /tmp/home &

Dieser Befehl wird im Hintergrund ausgeführt. Die Shell-Job-ID (in Klammern) und die Prozess-ID werden auf Ihrem Terminal angezeigt. Um den Job anzuhalten, führen Sie den Befehl wait gefolgt von der Jobspezifikation aus:

wait %2

Verwenden der Option -n mit dem Befehl „bash wait“

Mit der Option -n kann der Wait-Befehl nur angehalten werden, bis ein einziger Job aus den angegebenen PIDs oder Jobspezifikationen abgeschlossen ist, und gibt seinen Beendigungsstatus zurück. Wenn keine Argumente angegeben werden, wartet wait -n, bis ein beliebiger Hintergrundjob abgeschlossen ist, und gibt den Beendigungsstatus des Jobs zurück.

wait -n 45432 54346 76573

In the example above, wait -n only prints the return status of the job that exits first; it doesn’t show the job’s PID. If you want to get the job PID or jobspec for which the exit status is returned, use the -p Option, es einer Variablen zuzuweisen:

wait -p job_id -n 45432 54346 76573

The -p option was introduced in Bash 5.1. Using an older Bash version will result in an “invalid option” error.

Erkunden der Option -f mit dem Befehl „bash wait“

The -f option instructs waiting to pause for each PID or jobspec to terminate before returning its exit code rather than returning when the job status is changed. This option is only valid when job control is enabled, which is enabled by default only for interactive prompts.

Praktische Beispiele für den wait-Befehl

Der Befehl wait wird normalerweise in Shellskripten verwendet, die parallel ausgeführte Kindprozesse erzeugen. Um zu veranschaulichen, wie der Befehl funktioniert, erstellen wir 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 aufschlüsseln:

  • The first line, shebang, tells the operating system which interpreter to use to parse the rest of the file.
  • 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 des Sleep-Befehls. Wir speichern die PID in einer Variablen (process_id).
  • Die PID-Nummer wird ausgedruckt.
  • Die PID wird an den Wartebefehl übergeben, der pausiert, bis der Ruhebefehl abgeschlossen ist.
  • Der Beendigungsstatus des Wartebefehls wird gedruckt. $? ist eine interne Bash-Variable, die den Beendigungsstatus des zuletzt ausgeführten Befehls enthält.

Wenn Sie das Skript ausführen, wird ungefähr Folgendes ausgegeben:

PID: 36353
Exit status: 0

Here’s an example using the -n option:

#!/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, werden drei Hintergrundprozesse gestartet. „wait -n“ pausiert, bis der erste Job abgeschlossen und die Echo-Anweisung gedruckt ist. „wait“ pausiert, bis alle untergeordneten Hintergrundjobs abgeschlossen sind.

First job completed.
All jobs completed.

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

sleep 3600 &
[1] 46671
wait 46671

Öffnen Sie ein weiteres Terminal und stoppen Sie den Prozess mit dem Kill-Befehl:

kill -STOP 46671

Once the process status changes, the wait command will be completed, and the process exit code will be returned.

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

sleep 3600 &
wait -f 46671

Stoppen Sie den Vorgang vom anderen Terminal aus:

kill -STOP 46671

This time, the wait command will not be complete. It will run until the sleep process terminates.

Erweiterte Verwendung des Wait-Befehls

The wait command becomes particularly useful when managing multiple processes in a script. It allows you to control the execution flow and ensure that specific processes have been completed before others begin. Let’s delve into some more complex examples to illustrate this.

Bash wartet auf mehrere Prozesse

Consider a scenario where multiple processes run in the background, and you must act only after completing them. Here’s how you can use the wait command to achieve this:

#!/bin/bash
echo "Starting process 1..."
sleep 10 &
pid1=$!

echo "Starting process 2..."
sleep 15 &
pid2=$!

echo "Starting process 3..."
sleep 20 &
pid3=$!

echo "Waiting for processes to complete..."
wait $pid1 $pid2 $pid3
echo "All processes completed."

Dieses Skript startet drei Hintergrundprozesse, die jeweils 10, 15 und 20 Sekunden lang schlafen. Wir speichern die PID jedes Prozesses in einer Variablen. Dann verwenden wir den Wartebefehl mit allen drei PIDs als Argumente. Das Skript hält beim Wartebefehl an, bis alle drei Prozesse abgeschlossen sind.

Verwenden von Bash wait mit einer Schleife

You can also use wait with a loop to manage multiple processes. Here’s an example:

#!/bin/bash
for i in {1..5}
do
   echo "Starting process $i..."
   sleep $i &
   pids[${i}]=$!
done

echo "Waiting for processes to complete..."
for pid in ${pids[*]}; do
    wait $pid
done

echo "All processes completed."

In diesem Skript starten wir fünf Hintergrundprozesse in einer Schleife. Jeder Prozess schläft für einige Sekunden, die seinem Index in der Schleife entsprechen. Wir speichern die PID jedes Prozesses in einem Array. Nachdem wir alle Prozesse gestartet haben, durchlaufen wir das Array und verwenden den Wartebefehl, um jeden Prozess einzeln anzuhalten. Das Skript hält bei jedem Wartebefehl an, bis der entsprechende Prozess abgeschlossen ist.

Abschluss

The wait command in Bash is essential for synchronizing background processes within your scripts. By understanding how to use wait, you can control the flow of your script more precisely, ensuring that tasks are completed in the desired order. Whether you’re dealing with multiple background jobs or must ensure a specific process finishes before proceeding, the wait command can help you achieve more reliable and predictable script behavior. Consider integrating wait into your scripts to enhance process management and improve overall script efficiency.

Joshua James
Folgen Sie mir
Letzte Artikel von Joshua James (Alle anzeigen)

Hinterlasse einen Kommentar