wait

Czeka na zakończenie procesu potomnego i zwraca jego kod wyjścia.

wait to wbudowane polecenie powłoki (bash, a nie osobny program w /bin), które zatrzymuje wykonanie skryptu do momentu, aż zakończą się wskazane procesy potomne — na przykład zadania uruchomione w tle przez &. Zwraca kod wyjścia procesu, na który czekało, więc jest podstawowym narzędziem do synchronizacji: „odpal kilka rzeczy równolegle, poczekaj aż się zrobią, a potem jedź dalej”. Bez niego skrypt poleciałby do końca, zanim procesy w tle zdążyłyby coś zrobić.

Składnia i najważniejsze opcje

Podstawowa składnia: wait [-n] [-p ZMIENNA] [PID | %numer_zadania ...]

  • wait (bez argumentów) — czeka na wszystkie aktywne procesy potomne i zwraca 0.
  • wait PID — czeka na proces o danym identyfikatorze i zwraca jego kod wyjścia.
  • wait %1 — czeka na zadanie o numerze widocznym w jobs (tzw. jobspec).
  • -n — czeka na zakończenie dowolnego jednego z podanych zadań (albo pierwszego z brzegu, jeśli nie podasz listy) i zwraca jego kod. Dostępne od bash 4.3.
  • -p ZMIENNA — zapisuje PID lub jobspec ukończonego zadania do zmiennej; przydatne razem z -n, żeby wiedzieć, które zadanie właśnie padło. Dostępne od bash 5.1.

Przykłady użycia

  • sleep 5 & wait — uruchamia sleep w tle i czeka na jego koniec, zanim skrypt ruszy dalej.
  • ./backup.sh & PID=$!; wait $PID; echo "kod: $?" — łapie PID zadania w tle przez $!, czeka na nie i wypisuje jego kod wyjścia.
  • zad1 & zad2 & zad3 & wait — odpala trzy zadania równolegle i czeka aż wszystkie się skończą (klasyczny wzorzec „fan-out, potem join”).
  • wait -n job_a job_b — reaguje, gdy tylko pierwsze z dwóch zadań się zakończy, bez czekania na resztę.
  • wait -n -p ukonczone; echo "zakonczylo sie: $ukonczone" — czeka na dowolne zadanie i zapisuje jego PID do $ukonczone.

Częste błędy i pułapki

Najczęstsza pomyłka to podanie PID-u procesu, który nie jest dzieckiem bieżącej powłoki — wait obsługuje tylko własne procesy potomne, a dla obcego lub nieistniejącego PID-u zwróci kod 127 i od razu wróci. Chcesz poczekać na cudzy proces? To zadanie dla innych narzędzi, nie dla wait.

Druga pułapka: wait bez argumentów zawsze zwraca 0, nawet jeśli któreś zadanie w tle zakończyło się błędem — jeśli zależy Ci na kodach wyjścia poszczególnych zadań, czekaj na nie po kolei przez konkretny PID i sprawdzaj $?. Pamiętaj też, że -n i -p to nowsze dodatki bash — na starszych powłokach albo w czystym sh/POSIX ich nie znajdziesz, a dash zna tylko goły wait.

Powiązane komendy: jobs, bg, fg, kill, disown, oraz zmienna specjalna $! przechowująca PID ostatniego zadania w tle.