Der Befehl wait wartet auf die Beendigung von Hintergrundprozessen und gibt deren Exit-Status zurueck. Er ist ein in die Shell eingebauter Befehl und wird vor allem in Skripten verwendet, die mehrere Prozesse parallel ausfuehren.

Syntax des wait-Befehls

wait [OPTIONEN] [ID]...
  • ID - Eine Prozess-ID (PID) oder Job-Spezifikation. Ohne Angabe wartet wait auf alle Hintergrundjobs der aktuellen Shell.

Grundlegende Verwendung

Starte einen Prozess im Hintergrund und warte auf dessen Beendigung:

sleep 5 &
wait
echo "Prozess beendet"

Das &-Zeichen startet den Prozess im Hintergrund. Der wait-Befehl blockiert, bis dieser Prozess abgeschlossen ist.

Auf einen bestimmten Prozess warten

Mit der Prozess-ID kannst du gezielt auf einen bestimmten Hintergrundprozess warten:

sleep 10 &
pid=$!
echo "Warte auf Prozess $pid"
wait $pid
echo "Exit-Status: $?"

Die Variable $! enthaelt die PID des zuletzt gestarteten Hintergrundprozesses. Mit $? greifst du auf den Exit-Status des zuletzt beendeten Befehls zu.

Warten mit Job-Spezifikationen

Neben Prozess-IDs akzeptiert wait auch Job-Spezifikationen. Diese beginnen mit einem Prozentzeichen, gefolgt von der Jobnummer:

rsync -a /home /backup &

Die Shell zeigt die Jobnummer und PID an:

[1] 54377

Warte auf diesen Job mit:

wait %1

Die wichtigsten Optionen

Option -n: Auf den ersten beendeten Prozess warten

Mit -n wartet wait nur auf den ersten Prozess, der sich beendet:

sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "Ein Prozess wurde beendet"

Das Skript wartet nicht auf alle drei Prozesse, sondern faehrt fort, sobald der erste (nach 3 Sekunden) fertig ist.

Option -p: PID des beendeten Prozesses speichern

Ab Bash 5.1 kannst du mit -p die PID des beendeten Prozesses in einer Variable speichern:

sleep 3 &
sleep 5 &
wait -n -p fertig_pid
echo "Prozess $fertig_pid wurde zuerst beendet"

Option -f: Auf tatsaechliche Beendigung warten

Die Option -f stellt sicher, dass wait erst zurueckkehrt, wenn der Prozess wirklich beendet ist. Ohne -f kehrt wait auch bei einer Statusaenderung (z.B. gestoppt durch SIGSTOP) zurueck.

sleep 3600 &
wait -f $!

Diese Option ist nur bei aktivierter Job-Kontrolle relevant, die standardmaessig nur in interaktiven Shells aktiv ist.

Praktisches Beispiel: Parallele Verarbeitung

Ein typischer Anwendungsfall ist die parallele Ausfuehrung mehrerer Aufgaben:

#!/bin/bash

# Drei Aufgaben parallel starten
./backup-datenbank.sh &
pid1=$!

./backup-dateien.sh &
pid2=$!

./cleanup-logs.sh &
pid3=$!

# Auf alle warten
wait $pid1 $pid2 $pid3

echo "Alle Backups abgeschlossen"

Exit-Status auswerten

Der Exit-Status von wait entspricht dem Exit-Status des Prozesses, auf den gewartet wurde:

#!/bin/bash

(exit 42) &
pid=$!
wait $pid
echo "Exit-Status: $?"

Ausgabe:

Exit-Status: 42

Bei mehreren Prozessen gibt wait den Status des zuletzt angegebenen Prozesses zurueck.

Zusammenfassung

Der wait-Befehl synchronisiert Hintergrundprozesse in Bash-Skripten. Er wartet auf die Beendigung von Prozessen und liefert deren Exit-Status. Mit der Option -n wartest du nur auf den ersten beendeten Prozess, mit -f auf die tatsaechliche Beendigung statt nur auf Statusaenderungen.