首页 程序笔记 linux中bash shell的wait命令详解

linux中bash shell的wait命令详解

前言

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参数的使用场景。

2

站心网

前言 linux bash shell中的wait命令是一个等待给定操作完成并返回等待命令的退出状态的命令,由于wait命令..

为您推荐

交易系统:退款单模型设计详解

大家好,我是汤师爷~和退款单作为整个交易逆向系统的核心,支撑着售后管理环节。售后域核心概念模型1、退款单退款单是记录和跟踪退款处理过程的核心业务单据,包含以下关键信息:租户ID:标识所属商户或组织退款单ID..

JavaScript API 设计原则详解

前言本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块。系卤煮自己总结的一些经验和教训。本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来。很难做到详..

JavaScript 事件委托详解

基本概念事件委托,通俗地来讲,就是把一个元素响应事件(click、focus……)的函数委托到另一个元素;一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应..

如何选择更适合你的 Linux 发行版?

很多人经常会问我这样一个问题:“嘿,你是用Linux的,对吧?我应该使用Linux的哪个版本?我有这个朋友推荐我_____,你觉得怎么样?”我通常会以这样的问题回复:这取决于你想做什么?今天我决定写一篇关于如何选择L..

JavaScript 中的遍历详解

编程这么多年,要是每次写遍历代码时都用 for 循环,真心感觉对不起 JavaScript 语言~对象遍历为了便于对象遍历的测试,我在下面定义了一个测试对象obj。测试对象// 为 Object 设置三个自定义属性(可枚举)Object.p..

7大Git实用技巧和命令总结

Git 是一个非常强大的工具,它包含丰富的工具用以维护项目。本文介绍了一些 Git 日常使用过程中的实用技巧和命令,希望这些内容能够对大家有所帮助。Git diff通常情况下,我们会在自己的独立分支中完成需求开发,此..

详解:订单履约系统规划

大家好,我是汤师爷~什么是订单履约系统?订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。..

Redis 数据结构详解

Redis 数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。原子操作:最小的操作单位,不能继续拆分..

VS创建.NET Core项目使用Docker方式部署到Linux服务器

在 Visual Studio(VS) 中,使用 Docker 方式部署 .NET Core 项目 到 Linux 服务器,可以简化环境管理并提高部署效率。以下是完整教程:1. 在 VS 创建 .NET Core 项目并启用 Docker新建 ASP.NET Core 项目打开 Visu..

.NET C#中的Func、Predicate和Expression用法详解

在 .NET C# 中,Func、Predicate 和 Expression 是非常常见的委托类型和表达式树,广泛用于函数式编程、数据查询(如 LINQ)以及表达式编译等场景。以下是它们的详细用法和区别。1. FuncFunc 是一个通用委托,用于表..

.Net Core中Dapper的使用详解

1.安装Dapper这里直接使用Nuget安装。安装版本是1.50.5安装完成之后,发现Nuget下已经有了Dapper。2.创建DapperHelper接下来创建一个DapperHelper帮助类,来进行读取数据库连接字符串,打开数据库等操作。public cla..

Git 常用命令总结

基础命令初始化一个Git仓库:git init添加到暂存区:git add <file>提交到本地仓库:git commit -m <message>仓库版本号切换:git reset --hard commit_id查看提交历史:git log查看历史命令:git reflog丢弃工作区..

判断 nginx 服务是否启动,未启动自动重启 shell脚本

我的是宝塔面板直接上代码nginx_procnum=`ps -ef|grep "nginx"|grep -v grep|wc -l`if [ $nginx_procnum -eq 0 ]then echo "start nginx..." /etc/init.d/nginx startelse echo "no cmd" fi然后添加定时任务;每分钟..

Git 常用命令

仓库# 在当前目录新建一个Git代码库$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 下载一个项目和它的整个代码历史$ git clone [url]配置# 显示当前的Git配置$ git config --list# 编..

.NET Core开发常用命令

在ASP.NET Core开发中,以下是一些常用的命令:dotnet new:创建一个新的项目或项目文件。dotnet new web -n MyWebApp:创建一个新的Web应用程序项目。dotnet new mvc -n MyMvcApp:创建一个新的MVC应用程序项目。do..

删除文件和文件夹的cmd命令

cmd命令删除空文件夹 rd /s/q "D:\Program Files\afish"cmd命令删除里面的文件 del /a/f/q "D:\Program Files\afish\123.txt" 注意:路径带空格,加引号 介绍几个命令: dir 显示目录和文件 cd 进入目录 del 删除文..

DevEco Studio鸿蒙OS系统开发环境搭建详解

DevEco Studio 是华为推出的一款面向华为终端全场景多设备的集成开发环境(IDE),为开发者提供工程模板创建、开发、编译、调试、发布等E2E的HarmonyOS应用开发服务。DevEco Studio官网:https://developer.harmonyo..

c#中责任链模式详解

基本介绍:  “责任链”顾名思义,是指一个需要负责处理请求的链条。  每个链条节点都是一个单独的责任者,由责任者自己决定是否处理请求或交给下一个节点。  在设计模式中的解释则为:为请求创建了一个接收者..

linux shell的几种截取字符串的方法

写shell脚本时,免不了需要截图字符串,这里有几种截取字符串的方法供参考。假设shell中有字符串变量:str=aabbccddeeffaabbccddeeff1. 符号“#“截取,删除指定字符串最左边一次匹配位置左边的字符串,保留右边字符..

Linux sed命令关键字匹配文件中整行的任意字符然后替换整行

Linux sed命令关键字匹配文件中整行的任意字符然后替换整行语法:sed -i s/.*要匹配的字串符.*/待替换的字串符/ test.txt例如,文件中内容如下:aabbccddbbccdd要将包含bb的行替换为www,使用如下命令:sed -i s/.*b..

发表回复

返回顶部