wait
是等待给定作业完成并返回的命令退出状态等待的命令。
自从wait
命令影响当前 shell 执行环境,它在大多数 shell 中作为内置命令实现。
在本文中,我们将探讨 Bash 内置功能wait
命令。
Bash wait
命令#
的一般语法wait
内置采用以下形式:
ID
是进程或作业 ID。如果不ID
指定后,该命令将等待所有子后台作业完成。
The wait
命令返回等待的最后一个命令的退出状态。
例如,等待具有 PID 的后台进程7654
,你会使用:
wait 7654
当给出多个进程时,该命令等待所有进程完成。
作业是使用作业规范(“jobspec”)来指定的,这是一种引用构成作业的流程的方式。职位规范以百分比符号开头,后跟职位编号 (%n
)。这是一个例子:
在后台运行命令
:
rsync -a /home /tmp/home &
shell 作业 ID(用括号括起来)和进程 ID 将显示在您的终端上:
[2] 54377
要等待作业,请运行wait
命令后跟作业规范:
wait %2
当用-n
选项,该命令仅等待给定 pid 或 jobspec 中的单个作业完成并返回其退出状态。如果没有提供参数,wait -n
等待任何后台作业完成并返回作业退出状态。
wait -n 45432 54346 76573
在上面的例子中,wait -n
只打印最先退出的作业的返回状态;它不显示作业的 PID。如果您想获取返回退出状态的作业 pid 或作业规范,请使用-p
将其分配给变量的选项:
wait -p job_id -n 45432 54346 76573
-p
Bash 5.1 中引入了该选项。如果您使用较旧的 Bash 版本,您将收到“无效选项”错误。
The -f
选项告诉wait
在返回其退出代码之前等待每个 pid 或 jobspec 实际终止,而不是在作业状态更改时返回。该选项仅在启用作业控制时有效。默认情况下,仅针对交互式提示启用作业控制。
例子#
wait
通常用在生成并行执行的子进程的 shell 脚本中。
为了说明该命令的工作原理,请创建以下脚本:
#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
我们逐行解释一下代码:
- 第一行称为 shebang,告诉操作系统使用哪个解释器来解析文件的其余部分。
- 我们正在使用sleep命令来模拟耗时的后台进程。
-
$!
是一个内部 Bash 变量,用于存储最后一次在后台运行的作业的 PID。在此示例中,这是sleep
命令。我们将 PID 存储在变量中(process_id
).
- 打印 PID 号。
- PID 被传递到
wait
等待直到的命令sleep
命令完成。
- 打印退出状态
wait
命令。$?
是一个内部 Bash 变量,保存最后执行的命令的退出状态。
如果运行该脚本,它将打印如下内容:
PID: 36353
Exit status: 0
这里有一个使用的例子-n
option:
#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."
当脚本执行时,它会产生 3 个后台进程。wait -n
等待第一个作业完成并打印 echo 语句。wait
等待所有子后台作业完成。
first job completed
all jobs completed
最后一个例子解释了-f
选项。打开终端并运行:
sleep 3600 &
[1] 46671
等待过程:
wait 46671
打开另一个终端并使用以下命令停止该进程kill命令:
kill -STOP 46671
一旦进程状态发生改变,wait
命令将完成并返回进程退出代码。
现在,重复相同的步骤,但这次使用wait -f $pid
:
sleep 3600 &
wait -f 46671
从另一个终端停止该进程:
kill -STOP 46671
这次的wait
命令将无法完成。它将运行直到sleep
进程终止。
结论#
The wait
命令等待指定作业完成并返回作业的退出代码。
如果您有任何问题或反馈,请随时发表评论。