Linux. Команда wait
20.04.2018
Теги: Bash • CLI • Linux • Команда • Переменная
Если перенести команду на выполнение в фоновый режим, она будет выполняться в подоболочке независимо от текущей оболочки. Но иногда требуется подождать завершения фонового процесса (называемого также порожденным, поскольку он порожден родительским процессом в текущей оболочке), прежде чем продолжить работу. Например, крупное задание по сортировке данных может быть отправлено на выполнение в фоновый режим, а для доступа к отсортированным данным придется ждать завершения этого задания. Именно для этого предназначена команда wait
:
wait [идентификатор_процесса]
Если идентификатор процесса не указан, оболочка ждет завершения всех порожденных процессов. В этом случае выполнение текущей оболочки будет приостановлено до тех пор, пока не завершится ожидаемый процесс или ряд процессов.
Посмотрим на команду 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 $