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

#!/bin/bash
for i in 1 2 3 4 5
do
      echo “foo.sh – Looping … number $i”
done

Скрипт – bar.sh

#!/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

Результат

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
$

Пример 2 – Скрипт без команды wait

У нас есть два скрипта с именами «foo.sh» и «bar.sh».

Скрипт ‘foo.sh’ выводит числа от 1 до 5, а скрипт bar.sh вызывает foo.sh и запускает его в фоновом режиме, но не будет ждать завершения foo.sh и выполнения обоих скриптов.

Скрипт – foo.sh

#!/bin/bash
for i in 1 2 3 4 5
do
      echo “foo.sh – Looping … number $i”
done

Скрипт – bar.sh

#!/bin/bash
echo “Started bar.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

Результат

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

#!/bin/bash
for i in 1 2 3 4 5
do
      echo “foo.sh – Looping … number $i”
done

Скрипт – bar.sh

#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?

if [ $stat –eq 0 ]
then
       echo “Exit status - $stat”
else
        echo “Exit status - $stat”
fi

Результат

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

#!/bin/bash
for i in 1 2 3 4 5
do
      iiecho “foo.sh – Looping … number $i”
done

Скрипт– bar.sh

#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?

if [ $stat –eq 0 ]
then
       echo “Exit status - $stat”
else
        echo “Exit status - $stat”
fi

Результат

./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, так как ожидаю некоторого вывода от выполненной команды, которая будет использоваться для дальнейшего выполнения текущего процесса.

 

Поделитесь статьей:

4 thoughts on “🐧 Команда wait в Linux с примерами

  1. Хорошая статья, спасибо.
    Но в Пример -1 нет строки Completed bar.sh в bar,sh.
    а в вывод есть.

  2. В примере 2:
    – bra.sh вместо bar.sh
    – I большая, вместо i маленькая.

    Мне не понравилась статья. Но пишите дальше, будет лучше.

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