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>&-