Shell-使用&和wait让你的脚本并行执行

举报
小工匠 发表于 2021/09/10 00:22:22 2021/09/10
【摘要】 文章目录 概述常见的串行执行使用&和wait改造示例二 概述 我们知道shell中的命令都是串行执行的,如果想要充分利用服务器的资源,就需要些小技巧了。 假定业务上多个...


在这里插入图片描述


概述

我们知道shell中的命令都是串行执行的,如果想要充分利用服务器的资源,就需要些小技巧了。

假定业务上多个业务逻辑没有先后关系,每个脚本的执行时间也很长 ,推荐并行执行。

一般情况下,我们会把每个业务逻辑写到一个单独的脚本里,在服务器上逐一调用,每次都要手工去敲命令。

如果我们把这些脚本放到一个调用脚本里呢? 执行的时候去调用这个调用脚本,事实上linux会根据脚本中的顺序 串行去调用这些脚本,还不如自己在服务器上一个个的执行快呢,最起码手工逐个调用脚本还是并行的。


常见的串行执行

我们通过一个例子来演示下:

在这里插入图片描述

使用1.sh和2.sh模拟业务逻辑

[root@artisan test]# cat 1.sh 
#!/bin/bash
echo "1.sh 开始执行....."
echo "模拟业务逻辑,sleep 5秒, duang duang  duang~~~"
sleep 5s
echo "1.sh 执行结束....."

  
 
[root@artisan test]# cat 2.sh
#!/bin/bash
echo "2.sh 开始执行....."
echo "模拟业务逻辑,sleep 5秒, duang duang  duang~~~"
sleep 5s
echo "2.sh 执行结束....."
[root@artisan test]# 
  
 

我们将调用脚本放到 call_serial.sh

[root@artisan test]# cat call_serial.sh 
#!/bin/bash
#当前目录下执行如下脚本  相对路径
./1.sh 
./2.sh 
echo "继续执行剩下的逻辑..."
[root@artisan test]# 
  
 

执行call_serial.sh
在这里插入图片描述

call_serial.sh 可知为【串行


使用&和wait改造

  • 在每个进程中使用&符号进行让脚本在后台运行,无需等待当前进程结束。
  • 为了确保每个进程都执行完成,最后务必使用wait关键字,用来确保每一个子进程都执行完成。
[root@artisan test]# cat call_parallel.sh 
#!/bin/bash
#当前目录下执行如下脚本  相对路径
./1.sh &
./2.sh &
wait
echo "继续执行剩下的逻辑..."
[root@artisan test]# 
  
 

执行下看看效果
在这里插入图片描述

call_parallel.sh 可知为【并行

通过上述的改造,可以大大的提高多个进程并发执行的效率。 对于可以同时执行的业务逻辑,可以充分利用主机资源,减少等待时间。


示例二

在这里插入图片描述

serial.sh

#!/bin/bash
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)) "秒"
  
 

在这里插入图片描述

从执行结果来看,串行,每个进程都要耗时2秒,3个进程6秒处理完成


使用&和wait关键字来改造上上述脚本,使其并行执行

parallel.sh

#!/bin/bash
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关键字确保每一个子进程都执行完成
wait
endTime=`date +%s`
echo "总共耗时:" $(($endTime-$beginTime)) "秒"
  
 

在这里插入图片描述
从执行结果来看,并行,同时启动3个进程,3个进程2秒处理完成。


文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/87691890

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。