一:wait命令作用
wait是用来阻塞当前进程的执行,直至指定的子进程执行结束后,才继续执行。使用wait可以在bash脚本“多进程”执行模式下,起到一些特殊控制的作用。
二:使用格式
wait [进程号 或 作业号]
eg:wait 23 or wait %1
如果wait后面不带任何的进程号或作业号,那么wait会阻塞当前进程的执行,直至当前进程的所有子进程都执行结束后,才继续执行。
wait命令用来等待指令的指令,直到其执行完毕后返回终端。
该指令常用于shell脚本编程中,待指定的指令执行完成后,才会继续执行后面的任务。如果该指令等待作业时,在作业标识号前必须添加备份号"%"。
三:举例
以下案例均在CentOS7上执行
[root@node01 server]
CentOS Linux release 7.4.1708 (Core)
3.1 案例一
[root@node01 server]
echo "1"
sleep 5 &
echo "3"
echo "4"
wait
echo "5"
3.2 案例二:函数中使用wait
fun() {
echo "fun is begin.timeNum: $1"
local timeNum=$1
sleep $timeNum &
wait
echo "fun is end.timeNum: $timeNum"
}
fun 10 &
fun 5 &
wait
echo "all is ending"
1:加上两个wait的执行结果
fun is begin.timeNum:10
fun is begin.timeNum:5
fun is end.timeNum:5
fun is end.timeNum:10
all is ending
2:不加两个wait的执行结果
all is ending
[root@node01 server]
fun is end.timeNum: 10
fun is begin.timeNum: 5
fun is end.timeNum: 5
3.3 案例三
command
wait
echo "$?"
command
wait "$PID"
echo "$?"
3.4 案例四
cat test1 | uniq > newtest1 &
cat test2 | uniq > newtest2 &
wait
diff newtest1 newtest2
四:串行执行与并行执行
我们知道shell中的命令都是串行执行的,如果想要充分利用服务器的资源,就需要些小技巧了。
假定业务上多个业务逻辑没有先后关系,每个脚本的执行时间也很长 ,推荐并行执行。
4.1 串行执行
使用1.sh和2.sh两个脚本模拟业务逻辑
[root@node01 server]
echo '1.sh 开始执行......'
echo '模拟业务逻辑,sleep 5秒,duang duang duang ~~~'
sleep 5s
echo '1.sh 执行结束......'
[root@node01 server]
echo "2.sh 开始执行....."
echo "模拟业务逻辑,sleep 5秒, duang duang duang~~~"
sleep 5s
echo "2.sh 执行结束....."
我们将脚本放到 call_seria.sh脚本中
[root@node01 server]
./1.sh
./2.sh
echo "继续执行剩下的逻辑..."
执行 call_seria.sh脚本(注意给脚本加上执行权限)
4.2 并行执行
使用&和wait改造
在每个进程中使用&符号进行让脚本在后台运行,无需等待当前进程结束。
为了确保每个进程都执行完成,最后务必使用wait关键字,用来确保每一个子进程都执行完成。
[root@node01 server]
./1.sh &
./2.sh &
wait
echo "继续执行剩下的逻辑..."
执行看下效果:
4.3 串行与并行执行效率对比
串行执行的时间
[root@node01 server]
beginTime=`date +%s`
num=1
for i in `seq 1 3`
do
echo $i "业务逻辑 开始执行,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`
sleep 2s
echo $i "业务逻辑 执行完成,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`
echo "-----------------------------------------------------------"
done
endTime=`date +%s`
echo "总共耗时:" $(($endTime-$beginTime)) "秒"
执行结果
[root@node01 server]
beginTime=`date +%s`
num=1
for i in `seq 1 3`
do
{
echo $i "业务逻辑 开始执行,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`
sleep 2s
echo $i "业务逻辑 执行完成,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`
echo "-----------------------------------------------------------"
} &
done
wait
endTime=`date +%s`
echo "总共耗时:" $(($endTime-$beginTime)) "秒"
执行结果: