Linuxshell中的wait命令的使⽤
Linux shell中的wait命令的使⽤
⼀:wait命令作⽤
wait是⽤来阻塞当前进程的执⾏,直⾄指定的⼦进程执⾏结束后,才继续执⾏。使⽤wait可以在bash脚本“多进程”执⾏模式下,起到⼀些特殊控制的作⽤。
⼆:使⽤格式
wait [进程号或作业号]
eg:wait 23or wait %1
如果wait后⾯不带任何的进程号或作业号,那么wait会阻塞当前进程的执⾏,直⾄当前进程的所有⼦进程都执⾏结束后,才继续执⾏。
wait命令⽤来等待指令的指令,直到其执⾏完毕后返回终端。
该指令常⽤于shell脚本编程中,待指定的指令执⾏完成后,才会继续执⾏后⾯的任务。如果该指令等待
作业时,在作业标识号前必须添加备份号"%"。
三:举例
以下案例均在CentOS7上执⾏
[root@node01 server]# cat /etc/redhat-release
CentOS Linux release 7.4.1708(Core)
3.1 案例⼀
[root@node01 server]# cat 1.sh
#!/bin/bash
echo "1"
sleep 5&
echo "3"
echo "4"
wait # 会等待wait所在bash上的所有⼦进程的执⾏结束,本例中就是sleep 5这句
echo "5"
3.2 案例⼆:函数中使⽤wait
#!/bin/bash
fun(){
echo "fun is begin.timeNum: $1"
local timeNum=$1
sleep $timeNum &
wait
echo "fun is end.timeNum: $timeNum"
}
fun 10&
fun 5&
wait # 如果fun⾥⾯没有wait,则整个脚本⽴刻退出,不会等待fun⾥⾯的sleep,fun⾥的sleep语句依然会在后台执⾏完
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 # 这句话等最后⼀个“fun is end.timeNum:10”打印完毕后才会输出
2:不加两个wait的执⾏结果
all is ending
[root@node01 server]# fun is begin.timeNum: 10
fun is end.timeNum:10
fun is begin.timeNum:5
fun is end.timeNum:5
# 注意:这⾥不是特地加了⼀个空⾏,⽽是脚本执⾏完成以后光标就⼀直停在这⾥
3.3 案例三
command
wait
echo "$?"
# 脚本⾥这么写echo "$?"打印的是wait命令的执⾏结果,不是command的执⾏结果,因为wait本⾝是⼀个命令;
command
wait "$PID"
echo "$?"
3.4 案例四
cat test1 | uniq > newtest1 &
cat test2 | uniq > newtest2 &
wait
diff newtest1 newtest2
# 为了⽐较newtest1和newtest2的不同,必须先让以上的两个cat命令成功并执⾏完成并⽣成newtest1和newtest2,否则diff的执⾏将# 错误。。。⽽wait就是保证以上命令执⾏完成之后才执⾏diff命令....在
以上命令执⾏完成之前是不会执⾏diff命令的
四:串⾏执⾏与并⾏执⾏
我们知道shell中的命令都是串⾏执⾏的,如果想要充分利⽤服务器的资源,就需要些⼩技巧了。
假定业务上多个业务逻辑没有先后关系,每个脚本的执⾏时间也很长 ,推荐并⾏执⾏。
4.1 串⾏执⾏
使⽤1.sh和2.sh两个脚本模拟业务逻辑
[root@node01 server]# cat 1.sh
#!/bin/bash
echo '1.sh 开始执⾏......'
echo '模拟业务逻辑,sleep 5秒,duang duang duang ~~~'
sleep 5s
echo '1.sh 执⾏结束......'
[root@node01 server]# cat 2.sh
#!/bin/bash
echo "2.sh 开始执⾏....."
echo "模拟业务逻辑,sleep 5秒, duang duang duang~~~"
sleep 5s
echo "2.sh 执⾏结束....."
我们将脚本放到 call_seria.sh脚本中
[root@node01 server]# cat call_seria.sh
linux下的sleep函数#!/bin/bash
#当前⽬录下执⾏如下脚本相对路径
.
/1.sh
./2.sh
echo "继续执⾏剩下的逻辑..."
执⾏ call_seria.sh脚本(注意给脚本加上执⾏权限)
由上⾯的 call_seria.sh脚本执⾏结果可知为串⾏执⾏
4.2 并⾏执⾏
使⽤&和wait改造
在每个进程中使⽤&符号进⾏让脚本在后台运⾏,⽆需等待当前进程结束。
为了确保每个进程都执⾏完成,最后务必使⽤wait关键字,⽤来确保每⼀个⼦进程都执⾏完成。
[root@node01 server]# cat call_seria.sh
#!/bin/bash
#当前⽬录下执⾏如下脚本相对路径
./1.sh &
./2.sh &
wait
echo "继续执⾏剩下的逻辑..."
执⾏看下效果:
由上⾯的 call_parallel.sh 脚本执⾏结果可知为并⾏执⾏
通过上述的改造,可以⼤⼤的提⾼多个进程并发执⾏的效率。 对于可以同时执⾏的业务逻辑,可以充分利⽤主机资源,减少等待时间。
4.3 串⾏与并⾏执⾏效率对⽐
串⾏执⾏的时间
[root@node01 server]# cat seria.sh
#!/bin/bash
beginTime=`date +%s`
num=1
for i in `seq 13`
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))"秒"
执⾏结果
从执⾏结果来看,串⾏,每个进程都要耗时2秒,3个进程6秒处理完成使⽤&和wait关键字来改造上上述脚本,使其并⾏执⾏
[root@node01 server]# cat parallel.sh
#!/bin/bash
beginTime=`date +%s`
num=1
for i in `seq 13`
do
{
echo $i "业务逻辑开始执⾏,当前时间:" `date "+%Y-%m-%d %H:%M:%S"` sleep 2s
echo $i "业务逻辑执⾏完成,当前时间:" `date "+%Y-%m-%d %H:%M:%S"` echo "-----------------------------------------------------------"
# 结尾的&确保每个进程后台执⾏
}&
done
# wait关键字确保每⼀个⼦进程都执⾏完成
wait
endTime=`date +%s`
echo "总共耗时:" $(($endTime-$beginTime))"秒"
执⾏结果:
从执⾏结果来看,并⾏,同时启动3个进程,3个进程2秒处理完成。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论