
wait — это команда, которая ждет завершения указанных заданий и возвращает статус выхода ожидаемой команды.
Поскольку команда wait влияет на текущую среду выполнения оболочки, она реализована как встроенная команда в большинстве оболочек.
В этой статье мы рассмотрим встроенную в Bash команду wait .
Bash wait Команда
Общий синтаксис встроенной функции wait имеет следующий вид:
wait [ options ] ID
ID — это идентификатор процесса или задания. Если ID не указан, команда ожидает завершения всех дочерних фоновых заданий.
Команда wait возвращает статус завершения последней ожидаемой команды.
Например, чтобы дождаться фонового процесса с PID 7654 , вы должны использовать:
wait 7654
Если указано несколько процессов, команда ждет завершения всех процессов.
Задания определяются с помощью спецификации задания («jobspec»), которая представляет собой способ обозначения процессов, составляющих задание. Спецификация задания начинается с символа процента, за которым следует номер задания ( %n ). Вот пример:
Выполнить команду в фоновом режиме :
rsync -a /home /tmp/home &
Идентификатор задания оболочки (в скобках) и идентификатор процесса будут отображены на вашем терминале:
[2] 54377
Чтобы дождаться выполнения задания, выполните команду wait а затем укажите спецификацию задания:
wait %2
При вызове с опцией -n команда ожидает завершения только одного задания из указанных pid или jobspecs и возвращает код его завершения. Если аргументы не указаны, wait -n ожидает завершения любого фонового задания и возвращает код его завершения.
wait -n 45432 54346 76573
В приведенном выше примере wait -n выводит только код возврата задания, которое завершилось первым; идентификатор процесса (PID) задания не отображается. Если вы хотите получить идентификатор процесса (PID) или спецификацию задания, для которого возвращается код возврата, используйте опцию -p , чтобы присвоить его переменной:
wait -p job_id -n 45432 54346 76573
Параметр -p появился в Bash 5.1. Если вы используете более старую версию Bash, вы получите ошибку «недопустимый параметр».
Параметр -f указывает wait дождаться фактического завершения каждого pid или jobspec, прежде чем возвращать код выхода, а не возвращать его при изменении статуса задания. Этот параметр действителен только при включённом управлении заданиями. По умолчанию управление заданиями включено только для интерактивных запросов.
Примеры
wait обычно используется в скриптах оболочки, которые порождают дочерние процессы, выполняемые параллельно.
Чтобы проиллюстрировать работу команды, создайте следующий скрипт:
#!/bin/bash sleep 30 & process_id = $! echo "PID: $process_id " wait $process_id echo "Exit status: $? "
Давайте объясним код строка за строкой:
- Первая строка называется shebang и сообщает операционной системе, какой интерпретатор использовать для анализа оставшейся части файла.
- Мы используем команду
sleepдля эмуляции трудоемкого фонового процесса. -
$!— это внутренняя переменная Bash, которая хранит PID последнего задания, запущенного в фоновом режиме. В данном примере это PID командыsleep. Мы сохраняем PID в переменной (process_id). - Печатает номер PID.
- PID передается команде
wait, которая ждет завершения командыsleep. - Выводит статус завершения команды
wait.$?— внутренняя переменная Bash, которая хранит статус завершения последней выполненной команды.
Если запустить скрипт, он выведет что-то вроде этого:
PID: 36353 Exit status: 0
Вот пример использования опции -n :
#!/bin/bash sleep 3 & sleep 30 & sleep 5 & wait -n echo "First job completed." wait echo "All jobs completed."
При выполнении скрипта запускаются 3 фоновых процесса. wait -n ждет, пока завершится первое задание и будет напечатан оператор echo. wait ждет, пока завершится все дочерние фоновые задания.
first job completed all jobs completed
Последний пример поясняет опцию -f . Откройте терминал и выполните:
sleep 3600 &
[1] 46671
Дождитесь завершения процесса:
wait 46671
Откройте другой терминал и остановите процесс командой kill :
kill -STOP 46671
После изменения статуса процесса команда wait завершится и вернет код завершения процесса.
Теперь повторите те же шаги, но на этот раз используйте wait -f $pid :
sleep 3600 &wait -f 46671
Остановите процесс с другого терминала:
kill -STOP 46671
На этот раз команда wait не будет выполнена. Она будет выполняться до завершения процесса sleep .
Заключение
Команда wait ожидает завершения указанных заданий и возвращает код выхода задания.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства