Использование команды wait для синхронизации процессов
На этом этапе вы узнаете, как использовать команду wait
для синхронизации процессов, заставляя родительский процесс ждать завершения фоновых процессов.
Что такое команда wait?
Команда wait
используется в шелл-скриптах для приостановки выполнения скрипта до завершения одного или нескольких фоновых процессов. Это особенно полезно, когда вам нужно убедиться, что определенные задачи завершатся перед переходом к последующим операциям.
Использование команды wait без аргументов
При использовании без аргументов команда wait
ждет завершения всех фоновых процессов.
Давайте создадим скрипт, который демонстрирует это:
-
Перейдите в каталог проекта:
cd ~/project
-
Создайте новый скрипт:
nano wait_demo.sh
-
Добавьте следующее содержимое в скрипт:
#!/bin/bash
echo "Starting background tasks..."
## Start two background tasks
./long_task.sh &
./long_task.sh &
echo "Waiting for all background tasks to complete..."
wait
echo "All background tasks have completed!"
-
Сохраните файл и выйдите из редактора, нажав Ctrl+O
, затем Enter
, и в конце Ctrl+X
.
-
Сделайте скрипт исполняемым:
chmod +x wait_demo.sh
-
Запустите скрипт:
./wait_demo.sh
Вы увидите вывод, похожий на следующий:
Starting background tasks...
Starting long task with PID 1236
Starting long task with PID 1237
Waiting for all background tasks to complete...
Long task completed
Long task completed
All background tasks have completed!
Обратите внимание, что сообщение "All background tasks have completed!" появляется только после завершения обеих длительных задач. Это демонстрирует, как команда wait
приостанавливает выполнение скрипта до завершения всех фоновых процессов.
Использование команды wait с определенным PID
Вы также можете использовать команду wait
для ожидания завершения определенного процесса, указав его PID:
-
Создайте еще один скрипт:
nano wait_pid_demo.sh
-
Добавьте следующее содержимое:
#!/bin/bash
echo "Starting background tasks..."
## Start two background tasks and capture their PIDs
./long_task.sh &
pid1=$!
./long_task.sh &
pid2=$!
echo "First process PID: $pid1"
echo "Second process PID: $pid2"
echo "Waiting for the first task to complete..."
wait $pid1
echo "First task has completed!"
echo "Waiting for the second task to complete..."
wait $pid2
echo "Second task has completed!"
-
Сохраните файл и выйдите из редактора, нажав Ctrl+O
, затем Enter
, и в конце Ctrl+X
.
-
Сделайте скрипт исполняемым:
chmod +x wait_pid_demo.sh
-
Запустите скрипт:
./wait_pid_demo.sh
Вывод показывает, что скрипт ждет завершения каждого процесса по отдельности.
Переменная $!
содержит PID последнего запущенного фонового процесса. Это позволяет вам сохранить PID и использовать его позже с командой wait
.