Wait command in linux

Команда wait в Bash

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

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

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

Команда wait Bash

Общий синтаксис wait имеет следующий вид:

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

Команда wait возвращает статус выхода последней ожидаемой команды.

Например, чтобы дождаться фонового процесса с PID 7654 , вы должны использовать:

Когда задано несколько процессов, команда ожидает завершения всех процессов.

Задания указываются с использованием спецификации задания («спецификация задания»), которая является способом ссылки на процессы, составляющие задание. Спецификация задания начинается с символа процента, за которым следует номер задания ( %n ). Вот пример:

Идентификатор задания оболочки (в скобках) и идентификатор процесса будут отображаться на вашем терминале:

Чтобы дождаться задания, запустите команду wait за которой следует спецификация задания:

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

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

-p был представлен в Bash 5.1. Если вы используете старую версию Bash, вы получите ошибку «неверный вариант».

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

Примеры

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

Чтобы проиллюстрировать, как работает команда, создайте следующий сценарий:

Давайте объясним код построчно:

  1. Первая строка называется shebang и сообщает операционной системе, какой интерпретатор использовать для анализа остальной части файла.
  2. Мы используем команду sleep для имитации трудоемкого фонового процесса.
  3. $! — это внутренняя переменная Bash, в которой хранится PID последнего задания, запущенного в фоновом режиме. В этом примере это PID команды перехода в sleep . Мы сохраняем PID в переменной ( process_id ).
  4. Печатает номер PID.
  5. PID передается команде wait которая ожидает завершения команды sleep
  6. Печатает статус выхода команды wait . $? — это внутренняя переменная Bash, которая содержит статус выхода последней выполненной команды.

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

Вот пример использования опции -n

Когда скрипт выполняется, он порождает 3 фоновых процесса. wait -n ожидает завершения первого задания и вывода оператора echo. wait ожидает завершения всех дочерних фоновых заданий.

Последний пример объясняет параметр -f . Откройте терминал и запустите:

Откройте другой терминал и остановите процесс командой kill :

После изменения статуса процесса команда wait завершится и вернет код завершения процесса.

Теперь повторите те же шаги, но на этот раз используйте wait -f $pid :

Читайте также:  Посмотреть использованные порты linux

Остановите процесс с другого терминала:

На этот раз команда wait не завершится. Он будет работать до тех пор, пока не sleep процесс.

Вывод

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

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

Источник

🐧 Команда wait в Linux с примерами

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’ и завершается.

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

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

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

Пример: 3 – Скрипт с командой wait и статусом возврата

Скрипт ‘bar.sh’ вызовет foo.sh и запустит его в фоновом режиме, получит PID файла foo.sh и дождется его завершения, после его завершения запустится цикл bar.sh и завершится.

Наконец, он возвращает код выхода скрипта foo.sh

Скрипт – foo.sh (статус выхода = 0)

Скрипт – foo.sh (статус выхода = NON ZERO)

Заключение

Wait и Sleep – это системные вызовы в операционной системе, основанные на времени.

Давайте посмотрим разницу между командами wait и sleep.

Wait: когда пользователь хочет остановить текущий процесс, он освобождает все ресурсы, удерживаемые процессом, и ожидает выполнения другого процесса.

Нам нужно использовать notify, чтобы этот процесс знал, что надо начать выполнение снова после завершения другого процесса.

Sleep: этот системный вызов используется тогда, когда пользователь хочет на некоторое время остановить текущий процесс. Он удерживает блокировки ресурсов до истечения времени ожидания и снова запускает выполнение процесса. Здесь процесс имеет контроль на протяжении всего выполнения. Например, я выполнил некоторую команду в bash и хочу некоторое время уходить в sleep, так как ожидаю некоторого вывода от выполненной команды, которая будет использоваться для дальнейшего выполнения текущего процесса.

Читайте также:  Windows 10 and win64

Источник

Shell Script to Demonstrate Wait Command in Linux

Wait command is one of the process management commands. There are different process commands in Linux mainly 5 commands are widely used which are ps, wait, sleep, kill, exit.

ps is an acronym for process status. It displays information about the active processes. wait command will suspend execution of the calling thread until one of its children terminate. It will return the exit status of that command. The sleep command is used to delay the execution of the next command for a given number of seconds, hours, minutes, days. kill is used to terminate a background running process. It sends a terminate signal to the process and then processes halts. It takes process ID as an argument. exit command is used to exit from the current shell environment.

Let’s take some examples to understand more about wait commands:

wait is an inbuilt command in the Linux shell. It waits for the process to change its state i.e. it waits for any running process to complete and returns the exit status.

Syntax:

Here, ID is a PID (Process Identifier) which is unique for each running process. To find the process ID of a process you can use the command:

Example: Finding PID of VLC (video player)

Finding PID of process

Here, VLC is the process name. And 3868 is its Process ID.

Approach:

  • Creating a simple process.
  • Using a special variable($!) to find the PID(process ID) for that particular process.
  • Print the process ID.
  • Using wait command with process ID as an argument to wait until the process finishes.
  • After the process is finished printing process ID with its exit status.

Note: Exist status 0 indicates that the process is executed successfully without any issue. Any value other than 0 indicates that the process has not been completed successfully.

Script:

Output:

Using wait command

Here, we are creating a process that will create a file with a given string and store it into the storage device. Then using a special variable “$!” we will store the PID of that process into another variable pid. Then we are displaying the process ID and using the wait command to wait until the process is completed. After the process has been executed we are returning the process exit status code and its PID. If the Exit status code is 0 then we can say that the process is executed successfully.

For multiple processes:

Approach:

  • Creating multiple processes.
    • Creating a text file and writing into it.
    • Sleep 2 will pause the shell for 2 seconds.
    • Again creating a text file and writing into it.
  • Display that we are running multiple processes.
  • Using wait -f to wait until all the above process has been executed successfully.
  • After the process is finished we are printing its exit status using a special variable $?.

Script:

Output:

Using wait command

Here, we are creating 3 processes. Then we simply use the wait command to wait for all processes to be finished. -f is used to wait for all processes to be finished before returning the exit code. After that, we simply print the exit status of these processes using a special variable “$?”

Источник

Wait Command in Linux with Examples

Wait is a shell command that waits for a given process to complete, then returns its exit status. Wait command is used to wait either particular process ID and job ID and return their termination status.

Читайте также:  Minecraft forge windows download

When executing the big automation flow we need to make few modules should wait until the previous set of module complete and return data pipelined into next modules, in this case we can use Wait command until complete previous module.

How wait command works

Wait command used to monitor the previous process, depends on previous process return status it will return the exit status. For example, if we want to wait to complete a particular process ID 13245, then we should use “wait 13245“ when process 13245 complete wait command return the return values of 13245 exit status.

— wait PID (PID — Process ID of a command, for which the utility is to wait for the termination).
— wait JID (JID — Job ID that identifies a background process to wait for, applicable only for invocations of wait in the current shell execution environment).

The exit status value of wait command depends on the last PID/JID specified. When any process terminates abnormally then the exit status will be greater than 128.

Wait command exits with the value 0 when it calls with no child process and all process IDs are known by the current shell have terminated. If wait command detects any error then it returns any value from 1 to 126. If the last process id is unknown then wait command exits with value 127.

Wait Command Examples

Let us check a few scripts to understand how wait command works.

Example: 1 – Script with Wait command

We have two scripts called ‘foo.sh’ and ‘bar.sh’ script. ‘Foo.sh’ script print numbers between 1 to 5 and ‘bar.sh’ script will call the foo.sh and run it in the background, get the PID of foo.sh and wait for it to complete, once completes it will start ‘bar.sh’ loop and complete.

Example 2 – Script without wait command

We have two scripts called ‘foo.sh’ and ‘bar.sh’ script. ‘foo.sh’ script print numbers between 1 to 5 and bar.sh script will call the foo.sh and run it in background but it will not wait for foo.sh to complete and execute both scripts.

Example: 3 – Script with wait command & return status

‘bar.sh’ script will call the foo.sh and run it in background, get the PID of foo.sh and wait for it to complete, once it complete it will start bar.sh loop and complete, Finally, it return the exit code of foo.sh script.

Script – foo.sh (Exit status = 0)

Script – foo.sh (Exit status = NON Zero)

Conclusion

Wait and Sleep both are time-based system calls in the Operating system. Let’s check the difference between wait and sleep command.

Wait: When user wants to halt the current process and it releases all the resources hold by the process and waits for some other process to execute. We need to use notify to make this process aware that start execution again upon completion of other process.

Sleep: This system call is used when user wants to halt the current process for some time. It keeps the locks hold on resources till the sleep time is over and again starts the execution of the process. Here process has control throughout the execution. e.g I executed some command on bash and want to sleep for some time since expecting some output from executed command which will be utilized in further execution of current process.

Источник

Оцените статью