2020-12-11脚本编写遇到的一些坑

1、如何让编写的脚本变得更灵活

之前编写的脚本直接将变量直接装到数组里面了但是这样编写就让整个脚本变得很不灵活,这里自己想到一个点子,就是将配置文件里面需要编写脚本的信息直接截取出来放到数组里面具体实现
例如现在需要监控flume中source的receive速率 因此可以在flume的配置文件中将需要监控的中间件信息截取出来放到数组里

Rate=(`cat /etc/flume | grep -m1 agent.sources| awk '{print $1=null,$2=null,$0 |  tr -d "\r`)

注意:这里一定要使用tr去掉回车符这里是我遇到的一个大坑,因为如果不去回车符会跟着你的最后一个值一起存入数组,当你调用时最后一个值时会包含这个回车符,最终影响你最后结果

2、利用for 循环遍历数组

for (( i=0; i<${#Rate[@]}; i++ ))
do
done

这里需要注意的是 ${#Rate[@]}是代表数组的长度,直接echo ${Rate[@]}就是遍历数组

3、多线程对脚本加速

shell脚本的执行效率虽高,但当任务量巨大时仍然需要较长的时间,尤其是需要执行一大批的命令时。因为默认情况下,shell脚本中的命令是串行执行的。如果这些命令相互之间是独立的,则可以使用“并发”的方式执行这些命令,这样可以更好地利用系统资源,提升运行效率,缩短脚本执行的时间。如果命令相互之间存在交互,则情况就复杂了,那么不建议使用shell脚本来完成多线程的实现。

实现方案:
1.命令结尾添加:&

#/bin/bash
all_num=10
a=$(date +%H%M%S)
for num in `seq 1 ${all_num}`
do {
    sleep 1
    echo ${num}
} &
done
b=$(date +%H%M%S)
echo -e "startTime:\t$a"
echo -e "endTime:\t$b"

在命令的末尾加 & 符号,则命令将在后台执行,这样后面的命令不需要等待该命令执行完再开始执行。

2.解决主线程提前退出问题,添加 wait

#/bin/bash
all_num=10
a=$(date +%H%M%S)
for num in `seq 1 ${all_num}`
do {
    sleep 1
    echo ${num}
} & 
done
# 等待当前脚本进程下的子进程结束
wait
b=$(date +%H%M%S)
echo -e "startTime:\t$a"
echo -e "endTime:\t$b"

用{}把循环体括起来,后加一个&符号,代表每次循环都把命令放入后台运行一旦放入后台,就意味着{}里面的命令交给操作系统的一个线程处理了循环了1000次,就有1000个&把任务放入后台,操作系统会并发1000个线程来处理这些任务

wait命令的意思是,等待(wait命令)上面的命令(放入后台的)都执行完毕了再往下执行。
在这里写wait是因为,一条命令一旦被放入后台后,这条任务就交给了操作系统shell脚本会继续往下运行(也就是说:shell脚本里面一旦碰到&符号就只管把它前面的命令放入后台就算完成任务了,具体执行交给操作系统去做,脚本会继续往下执行),所以要在这个位置加上wait命令,等待操作系统执行完所有后台命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值