使用 wait 命令同步进程
在这一步中,你将学习如何使用 wait 命令来同步进程,使父进程等待后台进程完成。
什么是 wait 命令?
wait 命令用于 shell 脚本中,它会暂停脚本的执行,直到一个或多个后台进程完成。当你需要确保某些任务完成后再继续后续操作时,这个命令特别有用。
不带参数使用 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 命令如何暂停脚本,直到所有后台进程完成。
带特定 PID 使用 wait
你也可以通过提供特定进程的 PID 来使用 wait 命令等待该进程:
-
创建另一个脚本:
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 命令配合使用。