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]#
来源:CSDN
作者:逍遥不逍遥008
链接:https://blog.csdn.net/zhaoyq008/article/details/103480909