shell脚本多任务并发执行介绍(ping批量检测主机是否在线脚本)

文章详细探讨了Shell脚本中并发执行的原理,通过实例展示了如何使用for循环、sleep、wait和多并发技巧来管理和控制命令执行顺序。重点介绍了如何确保ping操作的并发结果正确性和避免资源耗尽问题。
摘要由CSDN通过智能技术生成

[root@controller ccx]# cat for.sh

for i in {1…10} ; do

echo $i &

#sleep 1 &

done

[root@controller ccx]#

[root@controller ccx]# sh for.sh

[root@controller ccx]# 3

4

8

9

5

7

10

2

6

1

[root@controller ccx]#

上述代码,为了更好的看出并发执行,我把sleep给注释了,可以看到,不仅没有顺序,而且有一个并不是运行结果(10个参数实际上只有9个值)

在这里插入图片描述

下面我们把sleep取消注释,而且让sleep也并发运行,下面运行结果也是一瞬间执行完毕,并且每一个参数都会执行完毕,也就是说sleep是有作用的,只是并发了一瞬间完成而已。

注:加个sleep虽然能解决参数有一个参数无法返回结果的问题,但执行次数多了会偶尔出现一次有一个参数无法返回结果,所以这不建议用,正规解决方法是 在脚本最后加上 wait,下面说明!

[root@controller ccx]# cat for.sh

for i in {1…10} ; do

echo $i &

sleep 1 &

done

[root@controller ccx]# sh for.sh

1

2

7

4

6

3

5

8

9

10

解决并发无序问题


前面说过了并发就是在命令后面加上&即可,但在并发执行时不能保证命令的执行顺序,如下图,本应在整个循环执行结束之后再执行的echo "END"命令,却会在程序中间被执行。所以在并发执行时,我们通常都需要保证在循环体中的所有命令都执行完后再向后执行接下来的命令,这时就可以使用 wait命令来实现。在Shell中使用wait命令,相当于其它高级语言里的多线程同步。

在这里插入图片描述

下面对代码进行改进,增加wait命令:

[root@controller ccx]# cat for.sh

for i in {1…10} ; do

echo $i &

#sleep 1 &

done

wait

echo “END”

[root@controller ccx]# sh for.sh

1

5

6

10

4

9

8

7

2

3

END

[root@controller ccx]# sh for.sh

2

5

7

8

6

10

4

9

1

3

END

可以看到,加了wait命令执行结果就正常了,如论循环怎么无序,END都会等for循环中结束了才会打印。

在这里插入图片描述

下面我会以ping主机是否能通的一个列子对并发进行说明。

以ping某段主机是否在线对并发进行说明

===================================================================================

编写一个脚本,扫描192.168.198.0/24网络里,当前在线的主机有哪些,能ping通就认为在线。

单命令使用(无依赖关系)


单命令就是只有一条命令输出结果,没有多条命令相互依赖的情况。

执行原理就是直接把该命令放后台,这个程序的所有过程都同步进行,无需等待上一个命令执行完毕!

普通脚本

编写一个脚本,扫描192.168.198.0/24网络里,当前在线的主机有哪些,能ping通就认为在线,下面脚本是一个最简单且只显示ping得通的ip,代码和执行结果如下:

[root@controller ccx]# cat ping2.sh

for i in {128…133};do

ip=“192.168.198.$i”

ping -c 2 $ip &> /dev/null && echo $ip is up

done

echo “END”

[root@controller ccx]# sh ping2.sh

192.168.198.129 is up

192.168.198.130 is up

END

[root@controller ccx]#

注:如上代码执行过程中不能ctrl+c结束,必须用ctrl+z转入后台的形式结束。

如上代码,实现过程是一条一条依次出现的,所以上面6个IP花了大概30秒,如果60个600个IP花的时间可想而知。

多并发脚本

我们对上普通代码加上 多并发格式即可,&和wait,代码和执行结果如下:

[root@controller ccx]# cat ping2.sh

for i in {128…133};do

ip=“192.168.198.$i”

ping -c 2 $ip &> /dev/null && echo $ip is up &

done

wait

echo “END”

[root@controller ccx]# sh ping2.sh

192.168.198.129 is up

192.168.198.130 is up

END

[root@controller ccx]#

如上代码,使用多并发形式执行的,6个ip地址执行花了约5秒,运行过程较普通脚本快了差不多6倍!

多命令使用(有依赖关系)


多命令就是说这个脚本输出结果时有多条命令相互依赖,我们需要把这些相互依赖的命令放在{}中,然后在反括号后面加上并发符号}&

一般像需要用到中括号的都是有for循环的,放{}的时候一定要放在循环语句里面,否则就无效,执行原理就是{}外面的for是一个父程序,而循环中的语句属于子程序,我们{}起来的是子程序,让子程序进入后台同步运行,需要注意的是,当需要并行执行的命令数量特别多,特别是所执行的命令占用的系统资源非常多时,可能会将整个系统的资源全部耗尽,影响其它程序的运行,这是并发执行的缺陷!

普通脚本

我对上述ping代码做过改进,我把ping得通和ping不通的都打印到屏幕上(这样代码间就出现了依赖关系,需要使用到{}

ps:实现原理,如果ping不通的是以From开头,根据此原理,我们可以用awk筛选出是否有From,如果有就是ping不通的,如果没有,便为ping得通的,最后再用if判断awk筛选的是字符串是否为0即可。

在这里插入图片描述

代码和执行结果如下:

[root@controller ccx]# cat ping.sh

#!/bin/bash

for i in {128…133};do

ip=“192.168.198.$i”

ping=ping -c 2 $ip |grep From| awk '{print $1}'

#echo $ping

#下面if是判断字符为空

if [ “$ping” = “” ] ; then

echo 192.168.198.$i is up

echo 192.168.198.$i is up >> /root/ccx/up.log

else

echo 192.168.198.$i not up

echo 192.168.198.$i not up >> /root/ccx/notup.log

fi

done

echo “END”

[root@controller ccx]#

[root@controller ccx]#

[root@controller ccx]# sh ping.sh

192.168.198.128 not up

192.168.198.129 is up

192.168.198.130 is up

192.168.198.131 not up

192.168.198.132 not up

192.168.198.133 not up

END

[root@controller ccx]# cat up.log

192.168.198.129 is up

192.168.198.130 is up

[root@controller ccx]# cat notup.log

192.168.198.128 not up

192.168.198.131 not up

192.168.198.132 not up

192.168.198.133 not up

[root@controller ccx]#

在这里插入图片描述

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

[外链图片转存中…(img-aA5VVB1L-1713383584432)]

[外链图片转存中…(img-hl1LO1SB-1713383584432)]

[外链图片转存中…(img-QK9Fpxpr-1713383584433)]

[外链图片转存中…(img-RlJZDXwZ-1713383584433)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值