文章目录

  • 一、wait 命令概述
  • 二、应用示例
    • 1.wait后面带进程号或者作业号
    • 2.wait 后面不带进程号或作业号
    • 3.在函数中使用wait
    • 4.使用&与wait让脚本并行执行
      • 示例一:调用不同逻辑脚本
      • 示例二:调用不同逻辑函数
      • 示例三:“for循环”并行运行

一、wait 命令概述

wait命令介绍

wait [作业指示或进程号]

1.等待作业号或者进程号制定的进程退出,返回最后一个作业或进程的退出状态状态(参考应用示例1)。如果没有制定参数,则等待所有子进程的退出,其退出状态为0(参考应用示例2)。

2.如果是shell中等待使用wait,则不会等待调用函数中子任务。在函数中使用wait,则只等待函数中启动的后台子任务。(参考应用示例3)

3.在shell中使用wait命令,相当于高级语言里的多线程同步。

语法

wait(参数) 使用 wait 是在等待上一批或上一个脚本执行完(即上一个的进程终止),再执行wait之后的命令。

参数

进程或作业标示:指定进程号或者作业号。


二、应用示例

1.wait后面带进程号或者作业号

[root@wqfrm_test] cat test_1.sh
#!/bin/bash
sleep 10 &
sleep 5 &
wait $! #$!表示上个子进程的进程号,wait等待一个子进程,等待5秒后,退出

2.wait 后面不带进程号或作业号

如果wait后面不带任何的进程号或作业号,那么wait会阻塞当前进程的执行,直至当前进程的所有子进程都执行结束后,才继续执行。

[root@wqfrm_test] cat test_2.sh
#!/bin/bash
echo "1"
sleep 5 & #在执行命令后加&操作符,表示将命令放在子shell中异步执行。可以达到多线程效果
echo "3"
echo "4"
wait    # 会等待wait所在bash上的所有子进程的执行结束,本例中就是sleep 5这句
echo "5"

3.在函数中使用wait

#!/bin/bash
fun() {echo "fun is begin.timeNum: $1"local timeNum=$1sleep $timeNum &wait #这个只等待wait前面sleepecho "fun is end.timeNum: $timeNum"
}
fun 10 &
fun 5 &
wait    #如果fun里面没有wait,则整个脚本立刻退出,不会等待fun里面的sleep,fun里的sleep语句依然会在后台执行完
echo "all is ending"

4.使用&与wait让脚本并行执行

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

并行执行

  • 在每个进程中使用 & 符号进行让脚本在后台运行,无需等待当前进程结束
  • 为了确保每个进程都执行完成,最后务必使用 wait 关键字,用来确保每一个子进程都执行完成。
  • 可以将不同业务逻辑写到一个个单独的脚本中,并行调用脚本;也可以将不同业务逻辑写成同一个脚本中函数的形式,并行调用函数。

示例一:调用不同逻辑脚本

使用 test_1.sh、test_2.sh 脚本来模拟业务逻辑

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

将调用脚本放到 execute_test.sh

串行情况执行脚本

[root@wqf rm_test]cat execute_test.sh
#!/bin/bash
#当前目录下执行如下脚本  相对路径
./test_1.sh
./test_2.sh
echo "继续执行剩下的逻辑..."

并行情况执行脚本

[root@wqf rm_test]cat execute_test.sh
#!/bin/bash
#当前目录下执行如下脚本  相对路径
./test_1.sh > ./test_1.log  2>&1 &
./test_2.sh > ./test_2.log  2>&1 &
wait
echo "继续执行剩下的逻辑..."

示例二:调用不同逻辑函数

[root@wqf rm_test]cat execute_test.sh
#!/bin/bash
function GZ_RISK_USER_INFO(){echo "test_1.sh 开始执行....."
echo "模拟业务逻辑,sleep 5秒, duang duang  duang~~~"
sleep 5s
echo "test_1.sh 执行结束....."
}function GZ_RISK_PAC_CON_INFO(){echo "test_2.sh 开始执行....."
echo "模拟业务逻辑,sleep 5秒, duang duang  duang~~~"
sleep 5s
echo "test_2.sh 执行结束....."
}function GZ_RISK_CALL_CHANGE_INFO(){echo "test_3.sh 开始执行....."
echo "模拟业务逻辑,sleep 5秒, duang duang  duang~~~"
sleep 5s
echo "test_3.sh 执行结束....."
}table_log_filepath='/apps/log/table_log'#各种信息表的变量
cur_day=$(date +"%Y%m%d")#并行运行三个函数
echo "各种信息表取数" `date "+%Y-%m-%d %H:%M:%S"`
GZ_RISK_USER_INFO  2>&1 | tee -a $table_log_filepath/cdc_gz_risk_user_info_${cur_day}.log &
GZ_RISK_PAC_CON_INFO 2>&1 | tee -a $table_log_filepath/cdc_gz_risk_pack_con_info_${cur_day}.log  &
GZ_RISK_CALL_CHANGE_INFO 2>&1| tee -a $table_log_filepath/cdc_gz_risk_call_change_info_${cur_day}.log &wait #wait关键字确保每一个函数子进程都执行完成

示例三:“for循环”并行运行

串行

[root@wqf rm_test]cat test_3.sh
#!/bin/bash
beginTime=`date +%s`
num=1
for i in `seq 1 3`
doecho $i  "业务逻辑 开始执行,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`sleep 2secho $i  "业务逻辑 执行完成,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`echo "-----------------------------------------------------------"
done
endTime=`date +%s`
echo "总共耗时:" $(($endTime-$beginTime)) "秒"

串行 执行效果 : 每个进程都要耗时2.3秒,3个进程7秒处理完成

并行

[root@wqf rm_test]cat test_4.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 2secho $i  "业务逻辑 执行完成,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`echo "-----------------------------------------------------------"# 结尾的&确保每个进程后台执行} &
donewait #wait关键字确保每一个子进程都执行完成endTime=`date +%s`
echo "总共耗时:" $(($endTime-$beginTime)) "秒"

**并行执行效果 ** : 同时启动3个进程,3个进程2秒处理完成。


shell wait的用法及使用“和wait”并行运行相关推荐

  1. 01 HBase基本概念和hbase shell常用命令用法

    本文转载自:http://archive.cnblogs.com/a/2178064/ 1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一 ...

  2. HBase基本概念和hbase shell常用命令用法

    1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...

  3. shell实例第20讲:linux shell date的用法

    linux shell date的用法 转自:https://www.cnblogs.com/faberbeta/p/linux-shell002.html 1.date中的参数 %% 一个文字的 % ...

  4. SHELL test [ 命令用法

    From: http://blog.csdn.net/ubuntulover/article/details/6978305 原文地址:http://www.examw.com/linux/all/1 ...

  5. shell字符串的用法

    shell字符串的用法 注意:shell4.2和shell4.1会有差别,较低版本的shell可能不支持某些功能 获取字符串长度:${#string} 获取子串: 注:(左边的第一个字符是用 0 表示 ...

  6. Shell expr的用法 bc 命令 let命令

    Shell expr的用法  bc 命令   let命令 数学运算 let命令  expr命令  bc命令  $(())   $[] http://www.80ops.cn/archives/245. ...

  7. Shell的基础用法

    Shell的基础用法 一.shell概述 shell是一个命令行解释器,它接受应用程序/用户命令.然后调用操作系统内核. shell也是一个功能强大的编程语言,易编写.易调试.灵活性高. 1)Linu ...

  8. Linux Shell nohup命令用法(内含代码演示)

    一.Linux Shell nohup命令用法 在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: ...

  9. linux until工具,Linux shell之until用法

    Linux shell之until用法 #!/bin/bash #until用法,显示变量值从0到99 varl=0                              #定义变量 echo & ...

最新文章

  1. N-Case 律师事务所管理系统安装与卸载说明
  2. Verilog赋值间延迟语句与赋值内延迟语句比较
  3. php mysql保存unicode_使用PHP和MySQL存储和显示unicode字符串(हिन्दी)
  4. bootstrap panel 布局
  5. 带你一文搞懂网络层的IP协议\数据链路层的以太网\ARP协议以及DNS和NAT协议
  6. Oracle PL/SQL编程之变量
  7. 设置 CSDN 博文里代码块的颜色
  8. linux下关于程序性能和系统性能的工具、方法
  9. java现代编译原理pdf脚本之家_详解编译器编译原理
  10. 安卓10源码开发定制(30)screencap命令源码分析
  11. 两电脑间传输文件|免费PC到PC文件传输软件
  12. VERICUT9.0三四五多轴仿真加工视频教程
  13. Android使用和风天气接口获取天气数据在APP中展示天气
  14. php匹配字符串中的url并替换为超链接
  15. python3.6 opencv3.4.3使用surf特征出错【解决方案】
  16. p5.js之“列阵绘图画板”实现大面积规律性绘制
  17. JAVA学习 API_day10(缓冲流, 打印流, 对象流)
  18. C++类和对象介绍(筑基上篇)
  19. gradle-6.7-all 快速下载
  20. 两行Python代码 新建一个txt文件并写入

热门文章

  1. java全栈工程师前景,已整理成文档
  2. 十三、买空卖空、融资融券、配资与杠杆
  3. OSChina 周一乱弹 —— 为什么人类和人工智能定要一战
  4. linux命令行自制屏保,Linux终端界面屏保
  5. 阿里云的这群疯子- 文/史中
  6. Word题注无法自动更新(删除其他题注后)
  7. 基金定投matlab程序,销售基金定投好简单:如何三分钟让客户理智开户做定投
  8. 连续信号、离散信号、模拟信号与数字信号区别
  9. HTML鲜花网页制作,Htlm技术设计鲜花盛开效果动态图
  10. the mid-autumn festival