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
shell脚本返回执行结果#运⾏需要15秒。
#!/bin/bash
for ((i=0;i<5;i++))
do
{
sleep 3;echo a
} &
done
wait
#打开5个⼦进程并⾏,运⾏只需要3秒。
例3:
⽤管道fifo⽂件来处理并发,本例转⾃my.oschina/sanpeterguo/blog/133304本例让博主学到很多,⽤到管道,read -u,exec的相关知识,后续博客陆续更新。
#!/bin/bash
#author : peterguo@tencent
#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>&-
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论