文章目录

一、wait 命令概述二、应用示例1.wait后面带进程号或者作业号2.wait 后面不带进程号或作业号3.在函数中使用wait4.使用&与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=$1

sleep $timeNum &

wait #这个只等待wait前面sleep

echo "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`

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秒,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 2s

echo $i "业务逻辑 执行完成,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`

echo "-----------------------------------------------------------"

# 结尾的&确保每个进程后台执行

} &

done

wait #wait关键字确保每一个子进程都执行完成

endTime=`date +%s`

echo "总共耗时:" $(($endTime-$beginTime)) "秒"

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

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。