侧边栏壁纸
  • 累计撰写 119 篇文章
  • 累计创建 60 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

linux中bash shell的wait命令详解

码峰
2022-10-24 / 0 评论 / 0 点赞 / 202 阅读 / 1,193 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-10-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

linux bash shell中的wait命令是一个等待给定操作完成并返回等待命令的退出状态的命令,由于wait命令会影响当前的shell执行环境,因此它在大多数shell中作为内置命令实现。在本文中,我们将探讨linux bash shell内置的wait命令。

基本语法

wait的基本语法采用以下形式:

wait [options] ID

ID是进程或者作业ID。如果未指定ID,则命令将等待,直到完成所有子后台作业。wait命令返回等待的最后一个命令的退出状态。
例如,要等待PID为123的后台进程,您可以使用:

$ wait 7654

当给定多个进程时,该命令将等待所有进程完成。
作业是使用作业规范(“jobspec”)指定的,作业规范是指构成作业的流程的一种方式。作业规格以百分比符号开头,后跟作业编号(%n)。下面是一个例子:

$ rsync -a /home /tmp/home &

shell作业ID(用括号包围)和进程ID将显示在终端上:

Output
[2] 54377

要等待这个作业,运行wait命令,后跟作业ID:

$ wait %2

当使用-n选项调用时,该命令仅等待给定pid或jobspec中的单个作业完成并返回其退出状态。如果没有提供参数,wait -n将等待所有后台作业完成并返回作业退出状态。见如下示例:

$ wait -n 20001 20002 20003

在上面的示例中,wait-n只打印首先退出的作业的返回状态;它不显示作业的PID。如果要获取返回退出状态的作业pid或作业规范,请使用-p选项将其分配给变量,如下:

$ wait -p job_id -n 20001 20002 20003

-p选项是在Bash 5.1中引入的。如果你使用的Bash版本较旧,会提示“无效选项”错误。

-f选项告诉wait等待每个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命令模拟一个耗时的后台进程。
  3. $! 是一个内部Bash变量,用于存储后台运行的最后一个作业的PID。在本例中,这是sleep命令的PID。我们将PID存储在变量(process_id)中。
  4. 打印PID编号。
  5. PID被传递给等待命令,等待直到睡眠命令完成。
  6. 打印等待命令的退出状态。$?是一个内部Bash变量,保存最后执行的命令的退出状态。
    如果运行脚本,它将打印如下内容:
Output
PID: 36353
Exit status: 0

-n选项的示例

shell脚本代码如下:

#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."

当以上脚本执行时,它会生成3个后台进程。wait-n等待直到第一个作业完成并打印echo语句。wait等待所有子后台作业完成。
运行以上脚本打印结果如下:

Output
first job completed
all jobs completed

-f选项的示例

最后一个例子解释了-f选项。打开终端并运行:

$ sleep 3600 &

输出结果:

Output
[1] 46666

等待进程:

wait 46666

打开另一个终端并使用kill命令停止进程:

kill  -STOP 46666

一旦进程状态更改,wait命令将完成并返回进程退出代码。

现在,重复相同的步骤,但这次使用wait-f $pid:

sleep 3600 &
wait -f 46666

打开另一个终端并使用kill命令停止进程:

kill  -STOP 46666

这一次,wait命令将无法完成。它将一直运行,直到睡眠进程终止。

结语

wait命令等待指定的作业完成,并返回作业的退出代码,注意-n和-f参数的使用场景。

0

评论区