bash并行

有些话、适合烂在心里 提交于 2019-12-10 21:21:21

bash中可以通过并行执行来提高效率。

1、无限制的并行实例:

##串行脚本
[root@centos7 scripts]# cat serial_proc_ping.sh 
#!/usr/bin/bash
#串行执行ping主机命令
#v1.0 by zhaoyq 20191210

for i in {1..255}
do
	ip=192.168.86.$i
	ping -c1 -W1 $ip &> /dev/null
	if [ $? -eq 0 ]
	then
		echo "$ip is up!"
	fi
done
[root@centos7 scripts]# 
##执行时间 4分9.156秒
[root@centos7 scripts]# time ./serial_proc_ping.sh 
192.168.86.1 is up!
192.168.86.2 is up!
192.168.86.128 is up!
192.168.86.129 is up!
192.168.86.130 is up!

real	4m9.156s
user	0m0.184s
sys	0m0.534s
[root@centos7 scripts]#

##并行脚本
[root@centos7 scripts]# cat multi_proc_ping.sh 
#!/usr/bin/bash
#并行执行ping主机命令
#v1.0 by zhaoyq 20191210

for i in {1..255}
do
	{
	ip=192.168.86.$i
	ping -c1 -W1 $ip &> /dev/null
	
	if [ $? -eq 0 ]
	then
		echo "$ip is up!"
	fi
	#echo $ip
	} & ##后台并行执行
done
wait ##等待上面的后台进程执行完成

[root@centos7 scripts]# 
##并行执行时间 1.348秒
[root@centos7 scripts]# time ./multi_proc_ping.sh 
192.168.86.1 is up!
192.168.86.2 is up!
192.168.86.129 is up!
192.168.86.128 is up!
192.168.86.130 is up!

real	0m1.348s
user	0m0.220s
sys	0m0.586s
[root@centos7 scripts]#
   可以看到并行与串行执行效率相差200多倍。

2、有限制的并行实例:

无限制的并行,如果并行程序太多,可能会造成将系统资源耗尽,或者无法预料的错误;要解决这个问题,可以通过管道文件,限制并行度;

[root@centos7 scripts]# cat multi_proc_ping2.sh 
#!/usr/bin/bash
#有限制并行执行ping主机命令
#v2.0 by zhaoyq 20191210
multi_procs=$1

mkfifo /tmp/$$.fifo
exec 6<> /tmp/$$.fifo ##打开文件句柄; 6<> 中间不能加空格
rm -f /tmp/$$.fifo

for j in ` seq $multi_procs`
do
	echo >&6  ## >&6 中间不能加空格,否则报语法错误
done


for i in {1..255}
do
	read -u 6
	{
	ip=192.168.86.$i
	ping -c1 -W1 $ip &> /dev/null
	
	if [ $? -eq 0 ]
	then
		echo "$ip is up!"
	fi
	echo >&6
	#echo $ip
	} & ##后台并行执行
done
wait ##等待上面的后台进程执行完成
exec 6<&- ##关闭文件句柄
echo "ping over!!"

[root@centos7 scripts]# 
##限制进程数为20,执行时间13.088秒
[root@centos7 scripts]# time ./multi_proc_ping2.sh 20
192.168.86.1 is up!
192.168.86.2 is up!
192.168.86.129 is up!
192.168.86.128 is up!
192.168.86.130 is up!
ping over!!

real	0m13.088s
user	0m0.262s
sys	0m0.585s
[root@centos7 scripts]# 
##限制进程数为10,执行时间25.445秒
[root@centos7 scripts]# time ./multi_proc_ping2.sh 10
192.168.86.1 is up!
192.168.86.2 is up!
192.168.86.128 is up!
192.168.86.129 is up!
192.168.86.130 is up!
ping over!!

real	0m25.445s
user	0m0.571s
sys	0m0.580s
[root@centos7 scripts]#
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!