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命令详解的更多相关文章

  1. shell 中grep命令详解

    用‘grep’搜索文本文件如果您要在几个文本文件中查找一字符串,可以使用‘grep’命令.‘grep’在文本中搜索指定的字符串.举个例子:假设您正在‘/usr/src/linux/Documentat ...

  2. [SHELL]:let 命令详解

    [SHELL]:let 命令详解 摘自:https://blog.csdn.net/happygongzhuo/article/details/6819099 let :简单的计算器  语 法let[ ...

  3. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  4. 【转】linux中ifconfig 命令详解详解

    1 概述 ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置.用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在.要想将上述的配置信息永远的存的电 ...

  5. 『忘了再学』Shell基础 — 32、Shell中test测试命令详解

    目录 1.test测试命令 (1)test命令介绍 (2)test命令使用方式 (3)示例 2.按照文件类型进行判断 3.按照文件权限进行判断 4.两个文件之间进行比较 5.两个整数之间比较 6.字符 ...

  6. Linux中rm命令详解

    linux下rm命令使用详解---linux删除文件或目录命令 用户可以用rm命令删除不需要的文件.该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除 ...

  7. SQL中EXPLAIN命令详解---(转)

    MySQL Explain详解   在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQ ...

  8. shell中的IFS详解

    在bash中IFS是内部的域分隔符,manual中对其的叙述如下:IFS The Internal Field Separator that is used for word splitting af ...

  9. 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:  ...

随机推荐

  1. JS设计模式——工厂模式详解

    它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ...

  2. Lucene入门学习

    技术原理: 开发环境: lucene包:分词包,核心包,高亮显示(highlight和memory),查询包.(下载请到官网去查看,如若下载其他版本,请看我的上篇文档,在luke里面) 原文文档: 入 ...

  3. 根据某个字段去重 根据另一个字段排序的一个SQL

    背景:一张表 有 name , crt_time , work_sts 三个字段 这张表里存在这样的数据 'a', '2018-12-18 21:37:24', '未''a', '2018-12-19 ...

  4. swust oj 1015

    堆排序算法 1000(ms) 10000(kb) 2631 / 5595 编写程序堆排序算法.按照从小到大的顺序进行排序,测试数据为整数. 输入 第一行是待排序数据元素的个数: 第二行是待排序的数据元 ...

  5. Python学习之旅(二十五)

    Python基础知识(24):正则表达式 正则表达式:检查一个字符串是否与某个模式匹配 \d :匹配数字 \w :匹配字母或数字 . :匹配任意字符 {n} :匹配n个字符 {m,n} :匹配m到n个 ...

  6. 51nod 1805 小树 (组合数模板,逆元公式)

    题意:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1805 题解: 根据cayley公式,无向图的每一个生成树就对应一个 ...

  7. css学习_css伪元素的本质

    1.伪元素的本质(插入了一个元素(行内元素/标签/盒子) 案例1: 案例2:

  8. css学习_css用户界面样式

    1.css用户界面样式 a.鼠标样式(记住几个兼容性好的) cursor:default/pointer/move/text; b.轮廓 outline outline:2px solid red: ...

  9. (二)juc线程高级特性——CountDownLatch / Callable / Lock

    5. CountDownLatch 闭锁 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能. CountDownLatch 一个同步辅助类, ...

  10. Java 8 Stream API说明

    Java 8增加了很多强大的功能,流(stream)就是其中之一.现在对api的使用做个说明: map 对流中的元素做转换,目前jdk提供了mapToInt,mapToLong,mapToDouble ...