重击等待命令

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: $?"

让我们逐行解释代码:

  1. 第一行称为shebang,它告诉操作系统使用哪个解释器来解析文件的其余部分。
  2. 我们正在使用 sleep 命令以模拟耗时的后台进程。
  3. $! 是内部Bash变量,用于在后台存储上一次运行的作业的PID。 在此示例中,这是 sleep 命令。 我们将PID存储在变量中(process_id)。
  4. 打印PID号。
  5. PID传递给 wait 等到 sleep 命令完成。
  6. 打印出的退出状态 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终端

Sidebar