云网牛站
所在位置:首页 > Linux命令 > 讲解Linux系统中的Bash wait命令语法及用法示例

讲解Linux系统中的Bash wait命令语法及用法示例

2021-01-27 11:38:07作者:陈铜稿源:云网牛站

本文讲解Linux系统中Bash内置的wait命令、语法及wait命令实际用法示例。wait是等待给定作业完成并返回waited for命令的退出状态的命令,由于wait命令会影响当前的Shell执行环境,因此它在大多数Shell中都作为内置命令实现。

讲解Linux系统中的Bash wait命令语法及用法示例

 

Bash wait命令语法

内置的wait一般语法采用以下形式:

wait [options] ID

参考:wait命令_Linux wait命令使用详解:等待进程执行完后返回

ID是流程或作业ID,如果未指定ID,则命令将等待直到所有子后台作业完成。

wait命令返回最后等待的命令的退出状态。

例如,要等待使用PID 7654的后台进程,可以使用:

wait 7654

当给出多个进程时,该命令等待所有进程完成。

使用作业规范(“jobspec”)指定作业,这是引用构成作业的流程的一种方式,作业规范以百分比符号开头,后跟作业编号(%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中引入,如果您使用的是较旧的Bash版本,则会收到“invalid option”错误。

-f选项告诉等待每个pid或jobspec实际终止,然后再返回其退出代码,而不是在更改作业状态时返回,仅当启用作业控制时,此选项才有效,默认情况下,仅对交互式提示启用作业控制。

 

wait命令用法示例

通常在生成并行执行的子进程的shell脚本中使用wait。

为了说明该命令的工作方式,请创建以下脚本:

#!/bin/bash

sleep 30 &

process_id=$!

echo "PID: $process_id"

wait $process_id

echo "Exit status: $?"

让我们逐行解释代码:

1、第一行称为shebang,它告诉操作系统使用哪个解释器来解析文件的其余部分。

2、我们正在使用sleep命令来模拟一个耗时的后台进程。参考sleep命令_Linux sleep命令使用详解:将目前动作延迟一段时间

3、$!是内部Bash变量,用于在后台存储上一次运行的作业的PID,在此示例中,这是sleep命令的PID,我们将PID存储在变量(process_id)中。

4、打印PID号。

5、PID传递给等待命令,该命令等待直到睡眠命令完成。

6、打印等待命令的退出状态,$?是内部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语句,等待等待所有子级后台作业完成:

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命令将不会完成,它将一直运行,直到睡眠过程终止。

 

相关主题

kill命令_Linux kill命令使用详解:删除执行中的程序或工作

Linux命令子频道
精选文章
热门文章