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 wartetwaitauf 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.