С чего начать Первые шаги трек · 15 ступеней
Linux Labs

wait — ожидание дочерней задачи в Bash

4 мин Ubuntu 24.04; Bash 5.2 for shell builtins

Встроенная команда Bash: ждёт дочернюю задачу и возвращает её статус завершения.

Шпаргалка

6 команд Версия для печати
  • type wait убедиться, что это builtin
  • help wait справка текущего Bash
  • sleep 2 & создать короткую дочернюю задачу
  • child_pid=$! сохранить её PID в этой оболочке
  • wait "$child_pid" дождаться результата
  • printf '%s\n' "$?" сразу показать статус wait

Обзор

wait — встроенная команда оболочки для ожидания её дочерних задач. Она не является универсальным способом ждать любой процесс, найденный через ps. Таблица заданий принадлежит конкретной оболочке.

После запуска в фоне приглашение возвращается раньше результата программы. wait позволяет соединить эти этапы: начать работу параллельно, а затем получить её итог. PID нужно сохранить сразу после соответствующего запуска.

Ключи

3

В Bash 5.2 доступны ожидание PID или задания, -n для следующего завершившегося из подходящих дочерних процессов, -p для сохранения выбранного идентификатора вместе с -n. При включённом управлении заданиями -f требует именно завершения, а не только изменения состояния.

Без аргументов команда ждёт фоновые задачи оболочки и возвращает ноль. Такой результат не является сводным доказательством успеха всех задач: для этого собирают отдельные статусы. Подробности установленной версии показывает help wait.

Ключ Что делает Пример
-n Дождаться следующего завершившегося из перечисленных дочерних процессов. wait -n "$pid1" "$pid2"
-p var Вместе с -n сохранить PID завершившегося процесса в переменную. wait -n -p done_pid "$pid1" "$pid2"
-f При управлении заданиями дождаться именно завершения, а не остановки процесса. wait -f "$child_pid"

Ничего не найдено. Попробуй запрос короче.

Рецепты

3

Сохранить статус до следующей команды

Выполни в одной оболочке:

bash
sleep 1 &
child_pid=$!
wait "$child_pid"
child_status=$?
printf 'status=%s\n' "$child_status"

Переменная хранит результат ожидания, даже когда последующие команды уже изменили $?. В прикладном сценарии реши заранее, что делать при неуспехе фоновой работы.

Не путать паузу и завершение

Для своего сохранённого PID используй wait -f "$child_pid", если при управлении заданиями требуется дождаться окончания. Приостановленная задача ещё может продолжить выполнение; состояние T не равно готовому результату.

Разделить запуск и проверку

Запускай задачу и выполняй ожидание в той же оболочке. Перенос одного числа PID в новый терминал не переносит родительские отношения и таблицу заданий.

Неполадки

2

PID не является дочерним для этой оболочки

Проверь место запуска. Для произвольной службы используй её менеджер и проверку результата. Подбор другого PID не исправляет отсутствие родства процессов.

Получен код от неожиданной команды

Между ожиданием и чтением $? уже выполнилась другая команда. Сохраняй значение сразу, как в рецепте выше. Сам по себе возврат приглашения не сообщает, успешно ли завершилась задача.

Опасно

Ожидание может быть долгим, если дочерняя программа не заканчивается. wait не посылает ей запрос на завершение и не задаёт тайм-аут.

В сценариях с set -e ненулевой статус требует продуманной обработки; иначе выполнение может оборваться раньше разбора результата. Эта статья не заменяет правила обработки ошибок всего сценария.

Встроенную команду Bash не следует смешивать с системными вызовами wait/waitpid, которыми программы собирают статусы своих детей.

См. также

  • background-jobs — запуск в фоне и номера заданий.
  • processes — родительские отношения и zombie.
  • bash — контекст выполнения оболочки.
  • sleep — задержка на заданное время.
Загрузка…