Команда Bash wait

Linux Bash подождите

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: $? "

Давайте объясним код строка за строкой:

  1. Первая строка называется shebang и сообщает операционной системе, какой интерпретатор использовать для анализа оставшейся части файла.
  2. Мы используем командуsleep для эмуляции трудоемкого фонового процесса.
  3. $! — это внутренняя переменная Bash, которая хранит PID последнего задания, запущенного в фоновом режиме. В данном примере это PID команды sleep . Мы сохраняем PID в переменной ( process_id ).
  4. Печатает номер PID.
  5. PID передается команде wait , которая ждет завершения команды sleep .
  6. Выводит статус завершения команды 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 ожидает завершения указанных заданий и возвращает код выхода задания.

Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.

терминал bash

Связанные руководства

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *