概述
我们知道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秒处理完成。