Команда wait

20.04.2018

Теги: BashCLILinuxКомандаПеременная

Если перенести команду на выполнение в фоновый режим, она будет выполняться в подоболочке независимо от текущей оболочки. Но иногда требуется подождать завершения фонового процесса (называемого также порожденным, поскольку он порожден родительским процессом в текущей оболочке), прежде чем продолжить работу. Например, крупное задание по сортировке данных может быть отправлено на выполнение в фоновый режим, а для доступа к отсортированным данным придется ждать завершения этого задания. Именно для этого предназначена команда wait:

wait [идентификатор_процесса]

Если идентификатор процесса не указан, оболочка ждет завершения всех порожденных процессов. В этом случае выполнение текущей оболочки будет приостановлено до тех пор, пока не завершится ожидаемый процесс или ряд процессов.

Действие, когда какая либо команда или сама командная оболочка инициирует (порождает) новый подпроцесс, чтобы выполнить какую либо работу, называется ветвлением (forking) процесса. Новый процесс называется «дочерним» (или «потомком»), а породивший его процесс — «родительским» (или «предком»). В результате и потомок и предок продолжают исполняться одновременно — параллельно друг другу.

Посмотрим на команду wait в действии:

$ sort big-data.txt > sorted-data.txt &
[1] 3590
$ date # выполнить другое задание
Пн апр 23 11:42:59 MSK 2018
$ wait 3590 # ждем заверешения задания на сортировку
[1]+    Готово    sort big-data.txt > sorted-data.txt
$

Если идентификатор процесса не указан, команда wait возвращает нулевой статус завершения. В противном случае, статус заверешния команды равен статусу завершения процесса, окончания которого ждали.

Переменная $!

Если в фоновом режиме выполняется несколько процессов и требуется подождать завершени только того процесса, который был запущен последним, то для доступа к его идентификатору можно использовать специальную переменную $!:

$ wait $!

Идентификаторы процессов можно хранить в ряде промежуточных переменных для последующего доступа:

$ program1 &
$ pid1=$!
..........
$ program2 &
$ pid2=$!
..........
$ wait $pid1 # ждать завершения программы program1
..........
$ wait $pid2 # ждать завершения программы program2

Чтобы проверить, выполняется ли запущенный процесс по-прежнему, достаточно вызвать команду ps с ключом -p и идентификатором процесса:

$ sort big-data.txt > sorted-data.txt &
[1] 3590
$ date # выполнить другое задание
Пн апр 23 11:42:59 MSK 2018
$ ps -p 3590 # выполняется еще задание на сортировку?
PID  TTY    TIME     CMD
3590 pts/17 00:00:00 bash
$ wait 3590 # ждем заверешения задания на сортировку
[1]+    Готово    sort big-data.txt > sorted-data.txt
$

Поиск: Bash • CLI • Linux • wait • Команда • Переменная

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.