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

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

20191230212731416.png

概述


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


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


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


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


常见的串行执行


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

2019021911125351.png

使用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


20190219111644734.gif


call_serial.sh 可知为【串行


使用&和wait改造

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


执行下看看效果


20190219113054117.gif


call_parallel.sh 可知为【并行

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


示例二


20190219114057769.png


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)) "秒"


20190219102727481.png

从执行结果来看,串行,每个进程都要耗时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)) "秒"


20190219102740717.png


从执行结果来看,并行,同时启动3个进程,3个进程2秒处理完成。

相关文章
|
1天前
|
分布式计算 Hadoop Shell
使用shell脚本实现自动SSH互信功能
使用shell脚本实现自动SSH互信功能
|
2天前
|
Unix Shell Linux
轻松编写 AIX Shell 脚本
轻松编写 AIX Shell 脚本
10 1
|
2天前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
3天前
|
关系型数据库 MySQL Shell
在Centos7中利用Shell脚本:实现MySQL的数据备份
在Centos7中利用Shell脚本:实现MySQL的数据备份
|
4天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
21 5
|
5天前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
|
5天前
|
存储 Shell C语言
shell脚本 编程 变量 基本入门(详解)
shell脚本 编程 变量 基本入门(详解)
|
5天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
13 3
|
11天前
|
弹性计算 运维 监控
|
11天前
|
存储 弹性计算 运维
自动化收集员工信息的Shell脚本
【4月更文挑战第30天】
10 0