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++))
sleep 3;echo a
#运行需要15秒。
#!/bin/bash
for ((i=0;i<5;i++))
sleep 3;echo a
#打开5个子进程并行,运行只需要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++));
done >&6 
#处理业务,可以使用while
for ((idx=0;idx<20;idx++));
    read -u6  #read -u6命令执行一次,相当于尝试从fd6中获取一行,如果获取不到,则阻塞
    #获取到了一行后,fd6就少了一行了,开始处理子进程,子进程放在后台执行
      a_sub_process && { 
         echo "sub_process is finished"
      } || {
         echo "sub error"
      #完成后再补充一个回车到fd6中,释放一个锁
      echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
#关闭fd6
exec 6>&-