重击等待命令
wait
是等待给定作业完成并返回等待命令的退出状态的命令。
自从 wait
该命令会影响当前的Shell执行环境,它在大多数Shell中都作为内置命令实现。
在本文中,我们将探讨内置的Bash wait
命令。
重击 wait
命令#
的一般语法 wait
内置采用以下形式:
wait [options] ID
ID
是流程或作业ID。 如果不 ID
指定后,命令将等待直到所有子后台作业完成。
的 wait
命令返回等待的最后一条命令的退出状态。
例如,等待带有PID的后台进程 7654
,您将使用:
wait 7654
当给出多个进程时,该命令等待所有进程完成。
使用作业规范(“作业规范”)指定作业,这是引用构成作业的流程的一种方式。 作业规范以百分比符号开头,后跟作业编号(%n
)。 这是一个例子:
在后台运行命令:
rsync -a /home /tmp/home &
Shell作业ID(用括号括起来)和进程ID将显示在终端上:
[2] 54377
要等待工作,请运行 wait
命令,然后是作业说明:
wait %2
当与 -n
选项,该命令仅等待给定的pid或jobspecs中的单个作业完成,并返回其退出状态。 如果没有提供参数, wait -n
等待任何后台作业完成并返回作业退出状态。
wait -n 45432 54346 76573
在上面的示例中, wait -n
仅显示首先退出的作业的返回状态; 它不显示作业的PID。 如果要获取返回其退出状态的作业pid或jobspec,请使用 -p
将其分配给变量的选项:
wait -p job_id -n 45432 54346 76573
-p
Bash 5.1中引入了option选项。 如果使用较旧的Bash版本,则会收到“无效选项”错误。
的 -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
选项:
#!/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
进程终止。
结论#
的 wait
命令等待指定的作业完成并返回作业的退出代码。
如果您有任何疑问或反馈,请随时发表评论。
bash终端