Сохранить статус до следующей команды
Выполни в одной оболочке:
Переменная хранит результат ожидания, даже когда последующие команды уже
изменили $?. В прикладном сценарии реши заранее, что делать при неуспехе
фоновой работы.
Встроенная команда Bash: ждёт дочернюю задачу и возвращает её статус завершения.
type wait
убедиться, что это builtin
help wait
справка текущего Bash
sleep 2 &
создать короткую дочернюю задачу
child_pid=$!
сохранить её PID в этой оболочке
wait "$child_pid"
дождаться результата
printf '%s\n' "$?"
сразу показать статус wait
wait — встроенная команда оболочки для ожидания её дочерних задач. Она не
является универсальным способом ждать любой процесс, найденный через ps.
Таблица заданий принадлежит конкретной оболочке.
После запуска в фоне приглашение возвращается раньше результата программы.
wait позволяет соединить эти этапы: начать работу параллельно, а затем
получить её итог. PID нужно сохранить сразу после соответствующего запуска.
В 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" |
Ничего не найдено. Попробуй запрос короче.
Выполни в одной оболочке:
Переменная хранит результат ожидания, даже когда последующие команды уже
изменили $?. В прикладном сценарии реши заранее, что делать при неуспехе
фоновой работы.
Для своего сохранённого PID используй wait -f "$child_pid", если при
управлении заданиями требуется дождаться окончания. Приостановленная задача
ещё может продолжить выполнение; состояние T не равно готовому результату.
Запускай задачу и выполняй ожидание в той же оболочке. Перенос одного числа PID в новый терминал не переносит родительские отношения и таблицу заданий.
Проверь место запуска. Для произвольной службы используй её менеджер и проверку результата. Подбор другого PID не исправляет отсутствие родства процессов.
Между ожиданием и чтением $? уже выполнилась другая команда. Сохраняй
значение сразу, как в рецепте выше. Сам по себе возврат приглашения не
сообщает, успешно ли завершилась задача.
Ожидание может быть долгим, если дочерняя программа не заканчивается. wait
не посылает ей запрос на завершение и не задаёт тайм-аут.
В сценариях с set -e ненулевой статус требует продуманной обработки; иначе
выполнение может оборваться раньше разбора результата. Эта статья не заменяет
правила обработки ошибок всего сценария.
Встроенную команду Bash не следует смешивать с системными вызовами wait/waitpid, которыми программы собирают статусы своих детей.
Есть неточность? Сообщить об ошибке в статье