Thank you for reading this post, don't forget to subscribe!
Wait — это команда shell, которая ожидает завершения определенного процесса, а затем возвращает его состояние завершения.
Команда wait используется для ожидания определенного идентификатора процесса и идентификатора задания и возврата их статуса завершения.
При выполнении большого потока автоматизации нам нужно сделать так, чтобы несколько модулей ожидали завершения предыдущего набора модулей и возвращали данные, конвейеризованные в следующие модули, в этом случае мы можем использовать команду Wait до завершения предыдущего модуля.
Как работает команда wait
Команда wait, используемая для наблюдения за предыдущим процессом, зависит от состояния возврата предыдущего процесса и возвращает статус выхода.
Например, если мы хотим дождаться завершения определенного идентификатора процесса 13245, то мы должны использовать «ждать 13245», когда процесс 13245 завершает команду ожидания, возвращающую значения 13245 состояния выхода.
— wait PID (PID — идентификатор процесса команды, для которой утилита ожидает завершения).
— wait JID (JID — идентификатор задания, который идентифицирует фоновый процесс, ожидающий wait, применим только для вызовов wait в текущей среде выполнения оболочки).
Значение состояния выхода команды ожидания зависит от последнего указанного PID / JID.
Если какой-либо процесс завершается ненормально, состояние выхода будет больше 128.
Команда ожидания завершается со значением 0, когда она вызывает без дочернего процесса, и все идентификаторы процесса, известные текущей оболочке, завершены.
Если команда wait обнаруживает какую-либо ошибку, она возвращает любое значение от 1 до 126.
Если последний идентификатор процесса неизвестен, команда ожидания завершается со значением 127.
Примеры команд wait
Давайте проверим несколько скриптов, чтобы понять, как работает команда wait.
Пример: 1 — скрипт с командой wait
У нас есть два скрипта с именами «foo.sh» и «bar.sh».
Скрипт «Foo.sh» выводит числа от 1 до 5, а скрипт «bar.sh» вызывает foo.sh и запускает его в фоновом режиме, получает PID для foo.sh и ожидает его завершения, после его завершения начнинает цикл ‘bar.sh’ и завершается.
Скрипт – foo.sh
1 2 3 4 5 |
#!/bin/bash for i in 1 2 3 4 5 do echo “foo.sh – Looping … number $i” done |
Скрипт – bar.sh
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash echo “Started bra.sh” echo “Started foo.sh” ./foo.sh & pid=$! wait $pid echo “Completed foo.sh” for I in 1 2 3 4 5 do echo “bar.sh – Looping … number $i” done |
Результат
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Started bar.sh Started foo.sh foo.sh – Looping .. number 1 foo.sh – Looping .. number 2 foo.sh – Looping .. number 3 foo.sh – Looping .. number 4 foo.sh – Looping .. number 5 Completed foo.sh bar.sh – Looping .. number 1 bar.sh – Looping .. number 2 bar.sh – Looping .. number 3 bar.sh – Looping .. number 4 bar.sh – Looping .. number 5 Completed bar.sh $ |
Пример 2 — Скрипт без команды wait
У нас есть два скрипта с именами «foo.sh» и «bar.sh».
Скрипт ‘foo.sh’ выводит числа от 1 до 5, а скрипт bar.sh вызывает foo.sh и запускает его в фоновом режиме, но не будет ждать завершения foo.sh и выполнения обоих скриптов.
Скрипт – foo.sh
1 2 3 4 5 |
#!/bin/bash for i in 1 2 3 4 5 do echo “foo.sh – Looping … number $i” done |
Скрипт – bar.sh
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash echo “Started bra.sh” echo “Started foo.sh” ./foo.sh & echo “Completed foo.sh” for I in 1 2 3 4 5 do echo “bar.sh – Looping … number $i” done |
Результат
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Started bar.sh Started foo.sh Completed foo.sh bar.sh – Looping .. number 1 bar.sh – Looping .. number 2 bar.sh – Looping .. number 3 bar.sh – Looping .. number 4 bar.sh – Looping .. number 5 Completed bar.sh $ foo.sh – Looping .. number 1 foo.sh – Looping .. number 2 foo.sh – Looping .. number 3 foo.sh – Looping .. number 4 foo.sh – Looping .. number 5 $ |
Пример: 3 — Скрипт с командой wait и статусом возврата
Скрипт ‘bar.sh’ вызовет foo.sh и запустит его в фоновом режиме, получит PID файла foo.sh и дождется его завершения, после его завершения запустится цикл bar.sh и завершится.
Наконец, он возвращает код выхода скрипта foo.sh
Скрипт — foo.sh (статус выхода = 0)
Скрипт — foo.sh
1 2 3 4 5 |
#!/bin/bash for i in 1 2 3 4 5 do echo “foo.sh – Looping … number $i” done |
Скрипт – bar.sh
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash ./foo.sh & BPID=$! wait $BPID stat=$? if [ $stat –eq 0 ] then echo “Exit status - $stat” else echo “Exit status - $stat” fi |
Результат
1 2 3 4 5 6 7 |
foo.sh – Looping .. number 1 foo.sh – Looping .. number 2 foo.sh – Looping .. number 3 foo.sh – Looping .. number 4 foo.sh – Looping .. number 5 Exit status - 0 $ |
Скрипт — foo.sh (статус выхода = NON ZERO)
Скрипт — foo.sh
1 2 3 4 5 |
#!/bin/bash for i in 1 2 3 4 5 do iiecho “foo.sh – Looping … number $i” done |
Скрипт– bar.sh
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash ./foo.sh & BPID=$! wait $BPID stat=$? if [ $stat –eq 0 ] then echo “Exit status - $stat” else echo “Exit status - $stat” fi |
Результат
1 2 3 4 5 6 7 |
./foo.sh: line 4: iiecho: command not found ./foo.sh: line 4: iiecho: command not found ./foo.sh: line 4: iiecho: command not found ./foo.sh: line 4: iiecho: command not found ./foo.sh: line 4: iiecho: command not found Exit status – 127 $ |
Заключение
Wait и Sleep — это системные вызовы в операционной системе, основанные на времени.
Давайте посмотрим разницу между командами wait и sleep.
Wait: когда пользователь хочет остановить текущий процесс, он освобождает все ресурсы, удерживаемые процессом, и ожидает выполнения другого процесса.
Нам нужно использовать notify, чтобы этот процесс знал, что надо начать выполнение снова после завершения другого процесса.
Sleep: этот системный вызов используется тогда, когда пользователь хочет на некоторое время остановить текущий процесс. Он удерживает блокировки ресурсов до истечения времени ожидания и снова запускает выполнение процесса. Здесь процесс имеет контроль на протяжении всего выполнения. Например, я выполнил некоторую команду в bash и хочу некоторое время уходить в sleep, так как ожидаю некоторого вывода от выполненной команды, которая будет использоваться для дальнейшего выполнения текущего процесса.