在 shell 脚本的世界中,进程管理和同步是至关重要的。Bashwait
命令是协调和调节多个进程的执行流程的一种快速简便的方法。了解如何wait
正确使用命令可以大大提高 shell 脚本的效率和可靠性。在本文中,我们将解构 Bash wait 命令,了解它的特性、典型用例和Linux中的最佳实践。
先决条件
- 访问命令行/终端。
- 管理员 (
sudo
) 权限。 - 文本编辑器,例如 Vim 或 Nano。
Bash 等待命令的语法
句法 | 描述 |
---|---|
wait |
等待子进程终止。 |
wait [-n] job_id |
等待具有指定 job_id 的作业终止。 如果作业已经终止,该 -n 选项会 立即返回。wait |
wait -n |
等待下一个后台作业终止。 |
等待指令
在 bash 脚本中使用时wait
,还需要注意三个参数:
- 命令后的符号 (&) 表示后台作业。
- $!返回
PID
最近后台进程的。使用多个后台进程时,请记住将前一个进程保存PID
在变量中。 - $? 显示最后一个进程的退出状态。
要显示这三个因素如何相互作用,请启动一个终端窗口并键入:
sleep 10 &
echo $!
echo $?
cloudbooklet@cloudbooklet:~$ sleep 10 &
[1] 15680 -
cloudbooklet@cloudbooklet:~$ echo 1
15680
cloudbooklet@cloudbooklet:~$ echo
0
cloudbooklet@cloudbooklet:~$
$!参数持有后台进程PID
,而 $? 存储退出状态。退出状态 0 表示命令成功。
单进程等待
首先打开终端并运行以下后台进程:
sleep 10 &
通过键入以下内容确认作业正在后台执行:
jobs -l
注意: 如果作业标记为已完成,请考虑将休眠时间增加到 10 秒以上。
使用wait
不带任何参数的命令暂停,直到程序完成:
wait
cloudbooklet@cloudbooklet:~$ sleep 10 &
[1] 49866
cloudbooklet@cloudbooklet:~$ jobs -l
[1]+ 49866 Running sleep 10 &
cloudbooklet@cloudbooklet:~$ wait
终端正在等待后台进程完成。
cloudbooklet@cloudbooklet:~$ sleep 10 &
[1] 49866
cloudbooklet@cloudbooklet:~$ jobs -l
[1]+ 49866 Running sleep 10 &
cloudbooklet@cloudbooklet:~$ wait
[1]+ Done sleep 10 &
终端在 10 秒后打印 Done 消息(由于 sleep 10)。
单进程 Bash 等待
使用该wait
命令指定脚本中的后台进程何时必须执行。
- 例如,在文本编辑器中,输入以下代码:
#!/bin/bash
echo Background process &
echo First message
echo Second message
wait
echo Third message
~
~
如果后台进程没有完成第一个和第二个进程,该wait
命令会导致暂停,以便wait
后台进程在继续执行第三个进程之前完成第二个进程。
- 将脚本另存为
single_process.sh
. 更改终端中的权限以使脚本可执行:
sudo chmod +x single_process.sh
- 使用以下命令运行脚本:
./single_process.sh
cloudbooklet@cloudbooklet:~$ ./single_process.sh
First process
second process
Background process
Third process
cloudbooklet@cloudbooklet:~$
指令执行后后台进程结束wait
,脚本继续执行。
多进程 Bash 等待
- 打开文本编辑器并粘贴以下包含多个进程的脚本:
#!/bin/bash
sleep 10 &
sleep 15 &
sleep 5 &
echo $(date +%T)
wait
echo $(date +%T)
~
~
该脚本在命令前后打印当前时间wait
。没有任何参数,应用程序只是等待所有进程完成。
- 关闭文件并将脚本另存为
test.sh
. 接下来使脚本可执行:
sudo chmod +x test.sh
- 最后,执行程序:
./test.sh
cloudbooklet@cloudbooklet:~$ ./test.sh
14:32:22
14:32:37
cloudbooklet@cloudbooklet:~$
因为操作在后台运行,所以这三个操作都在十五秒内完成。
- 运行相同的脚本来测试以下用例:
- 将
-n
参数添加到wait
. 只有最快的进程完成,脚本会在十秒内停止。 - 添加作业 ID 以指定脚本应等待的作业。等待 %1 暂停以等待进程 1(睡眠 10)完成。
多进程 Bash 等待 PID
- 使用多个进程时,使用
PID
来标识进程。以下示例脚本说明了一个用例:
#!/bin/bash
echo "Process 1 lasts for 2s" && sleep 2 &
PID=$!
echo "Process 2 lasts for 3s" && sleep 3 &
echo "Current time $(date +%T)"
wait $PID
echo "Process 1 ended at time $(date +%T) with exit status $?"
wait $!
echo "Process 2 ended at time $(date +%T) with exit status $?"
~
~
- 脚本应另存为
multi_wait.sh
. 通过键入以下命令使脚本可执行:
sudo chmod +x multi_wait.sh
- 运行脚本查看结果:
./multi_wait.sh
cloudbooklet@cloudbooklet:~$ ./multi_process.sh
Process 1 lasts for 2s
Process 2 lasts for 3s
Current time 15:56:22
Process 1 ended at time 15:56:24 with exit status ©
Process 2 ended at time 15:56:25 with exit status ©
cloudbooklet@cloudbooklet:~$
该脚本在两秒内完成第一个过程(由于睡眠 2),在三秒内完成第二个过程。这两个操作同时运行,需要三秒钟才能完成。
另请阅读:您可能还会发现我们关于 如何使用 cd 命令在 Linux 中更改目录的指南很有用。
结论
最后,Bashwait
命令被证明是在 shell 脚本中管理进程同步的不可或缺的工具。它通过暂停执行直到定义的程序完成来确保有序执行并减少错误。将命令合并wait
到您的脚本中可以使您提高效率并有效地控制并发进程。请随时在下面的评论部分分享您的想法和反馈。
原创文章,作者:主机说,如若转载,请注明出处:https://www.hostingtalk.cn/how-to-use-bash-wait-command-in-linux/