shell中wait命令详解
wait命令介绍
wait [作业指示或进程号]
1.等待作业号或者进程号制定的进程退出,返回最后一个作业或进程的退出状态状态。如果没有制定参数,则等待所有子进程的退出,其退出状态为0.
2.如果是shell中等待使用wait,则不会等待调用函数中子任务。在函数中使用wait,则只等待函数中启动的后台子任务。
3.在shell中使用wait命令,相当于高级语言里的多线程同步。
语法
wait(参数) 使用 wait 是在等待上一批或上一个脚本执行完(即上一个的进程终止),再执行wait之后的命令。
参数
进程或作业标示:指定进程号或者作业号。
实例
1.使用wait等待所有子任务结束。
[plain] view plain copy#!/bin/bash
sleep 10 &
sleep 5&
wait #等待10秒后,退出
[plain] view plain copy#!/bin/bash
sleep 10 &
sleep 5&
wait $! #$!表示上个子进程的进程号,wait等待一个子进程,等待5秒后,退出
2.在函数中使用wait
[plain] view plain copy#!/bin/bash
source ~/.bashrc
fun(){
echo "fun is begin.timeNum:$timeNum"
local timeNum=$1
sleep $timeNum &
wait #这个只等待wait前面sleep
echo "fun is end.timeNum:$timeNum"
}
fun 10 &
fun 20 &
wait #如果fun里面没有wait,则整个脚本立刻退出,不会等待fun里面的sleep
echo "all is ending"
输出结果为:
[plain] view plain copyfun is begin.timeNum:10
fun is begin.timeNum:20
fun is end.timeNum:10
fun is end.timeNum:20
all is ending
从输出结果,可以看到,整个脚本,等待了所有子任务的退出
- #!/bin/bash
- for ((i=0;i<5;i++))
- do
- sleep 3;echo a
- done
- #运行需要15秒。
- #!/bin/bash
- for ((i=0;i<5;i++))
- do
- {
- sleep 3;echo a
- } &
- done
- wait
- #打开5个子进程并行,运行只需要3秒。

例3:
用管道fifo文件来处理并发,本例转自https://my.oschina.net/sanpeterguo/blog/133304
本例让博主学到很多,用到管道,read -u,exec的相关知识,后续博客陆续更新。

- #!/bin/bash
- #author : peterguo@tencent.com
- #date : 2013.05.24
- #sub process do something
- function a_sub_process {
- echo "processing in pid [$$]"
- sleep 1
- }
- #创建一个fifo文件
- FIFO_FILE=/tmp/$.fifo
- mkfifo $FIFO_FILE
- #关联fifo文件和fd6
- exec 6<>$FIFO_FILE # 将fd6指向fifo类型
- rm $FIFO_FILE
- #最大进程数
- PROCESS_NUM=4
- #向fd6中输入$PROCESS_NUM个回车
- for ((idx=0;idx<$PROCESS_NUM;idx++));
- do
- echo
- done >&6
- #处理业务,可以使用while
- for ((idx=0;idx<20;idx++));
- do
- read -u6 #read -u6命令执行一次,相当于尝试从fd6中获取一行,如果获取不到,则阻塞
- #获取到了一行后,fd6就少了一行了,开始处理子进程,子进程放在后台执行
- {
- a_sub_process && {
- echo "sub_process is finished"
- } || {
- echo "sub error"
- }
- #完成后再补充一个回车到fd6中,释放一个锁
- echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
- } &
- done
- #关闭fd6
- exec 6>&-
shell中wait命令详解的更多相关文章
- shell 中grep命令详解
用‘grep’搜索文本文件如果您要在几个文本文件中查找一字符串,可以使用‘grep’命令.‘grep’在文本中搜索指定的字符串.举个例子:假设您正在‘/usr/src/linux/Documentat ...
- [SHELL]:let 命令详解
[SHELL]:let 命令详解 摘自:https://blog.csdn.net/happygongzhuo/article/details/6819099 let :简单的计算器 语 法let[ ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- 【转】linux中ifconfig 命令详解详解
1 概述 ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置.用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在.要想将上述的配置信息永远的存的电 ...
- 『忘了再学』Shell基础 — 32、Shell中test测试命令详解
目录 1.test测试命令 (1)test命令介绍 (2)test命令使用方式 (3)示例 2.按照文件类型进行判断 3.按照文件权限进行判断 4.两个文件之间进行比较 5.两个整数之间比较 6.字符 ...
- Linux中rm命令详解
linux下rm命令使用详解---linux删除文件或目录命令 用户可以用rm命令删除不需要的文件.该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除 ...
- SQL中EXPLAIN命令详解---(转)
MySQL Explain详解 在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQ ...
- shell中的IFS详解
在bash中IFS是内部的域分隔符,manual中对其的叙述如下:IFS The Internal Field Separator that is used for word splitting af ...
- linux中top命令详解
linux的top命令里的cpu信息是什么意思呢? Cpu(s): 62.1% us, 15.9% sy,0.1% ni, 19.4% id,2.0% wa,0.1% hi,0.4% si Mem: ...
随机推荐
- xdebug php 运行效率分析工具
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. 官网:https://xdebug.org/index.php 安装方法: ht ...
- docker应用-6(mysql+mycat 搭建数据库集群)
上一节,通过使用overlay网络,搭建了跨主机的docker容器集群.下面,在这个跨主机的docker容器集群环境下,搭建mysql 数据库集群. mysql主从自动备份和自动切换 从数据安全性考虑 ...
- xgboost原理
出处http://blog.csdn.net/a819825294 1.序 距离上一次编辑将近10个月,幸得爱可可老师(微博)推荐,访问量陡增.最近毕业论文与xgboost相关,于是重新写一下这篇文章 ...
- [原] MyBatis 整理
花了一上午的时间,先整理一个脑图.
- 安装 docker
Image 仓库 配置国内镜像源 windows下载 Docker Desktop centos 安装 Docker yum install docker -y service docker star ...
- 做二级菜单时候遇到的关于事件冒泡以及mouseover和mouseenter的不同
二级菜单作为最普通小组件,我遇到了坑. <style> .wrapper { height: 150px; border: 1px solid; width: 150px; } .wrap ...
- ArcGIS AddIN异常:无法注册程序集 未能加载文件或程序集"ESRI.ArcGIS.Desktop.Addins"
异常: 无法注册程序集“D:\CodeXX\bin\Debug\XX.dll”.未能加载文件或程序集“ESRI.ArcGIS.Desktop.AddIns, Version=10.1.0.0, Cul ...
- 《PHP - CGI/Fastcgi/PHP-FPM》
先说下我最近看到的一篇文章,哈哈哈,特别好玩. 一步步教你编写不可维护的 PHP 代码 之前一直知道 PHP 在 CGI 模式下运行.命令行下在 CLI 模式下运行. 但是 FPM 和 nginx 配 ...
- Java学习-050-AES256 之 java.security.InvalidKeyException: Illegal key size or default parameters 解决方法
在进行 Java AES 加密测试时,出现如下错误信息: java.security.InvalidKeyException: Illegal key size or default paramete ...
- jsr-303 参数校验-学习(转)
1.是什么? JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,比如: ----------------------------------------------- ...