Поиск по сайту:
Труд избавляет человека от трех главных зол — скуки, порока и нужды (Ф. Вольтер).

Команда wait в Bash

27.01.2021
Bash Heredoc

wait — это команда, которая ожидает завершения заданных заданий и возвращает статус выхода ожидаемой команды.

Поскольку команда wait влияет на текущую среду выполнения оболочки, в большинстве оболочек она реализована как встроенная команда.

В этой статье мы рассмотрим встроенную команду wait в Bash.

 

Команда wait в Bash

Общий синтаксис 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 или заданий и возвращает статус завершения. Если аргументы не указаны, wait -n ожидает завершения любого фонового задания и возвращает статус завершения задания.

wait -n 45432 54346 76573

 

Читать  Совместима ли Linux с POSIX?

В приведенном выше примере выводится wait -nтолько статус возврата задания, которое завершается первым; он не показывает PID задания. Если вы хотите получить идентификатор задания или спецификацию задания, для которого возвращается статус выхода, используйте параметр -p, чтобы назначить его переменной:

wait -p job_id -n 45432 54346 76573

 

Опция -p была представлена ​​в Bash 5.1. Если вы используете старую версию Bash, вы получите ошибку “invalid option”.

Параметр -f сообщает, что wait нужно дождаться фактического завершения каждого pid или jobpec, прежде чем возвращать свой код выхода, а не возвращаться при изменении статуса задания. Эта опция действительна, только если включено управление заданиями. По умолчанию управление заданиями включено только для интерактивных подсказок.

 

Примеры

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, которая содержит статус выхода последней выполненной команды.
Читать  Как включить темный режим в VLC

Если вы запустите сценарий, он напечатает что-то вроде этого:

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 ожидает завершения указанных заданий и возвращает код завершения задания.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Это может быть вам интересно


Рекомендуемое
Разнообразное меню от компании Макароллыч Суши и роллы – популярные…

Спасибо!

Теперь редакторы в курсе.