如何实现Shell脚本同时执行文件所有行,避免逐行处理每个接口等待3秒
解决方案
你可以将单个接口的计算逻辑封装为独立后台任务执行,所有接口任务会并行启动,整体耗时仅需3秒+命令执行开销,无需逐个等待。
修改后代码
# 单接口处理函数 calc_port_util() { line=$1 before=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$line | awk '{print $4}') sleep 3 after=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$line | awk '{print $4}') res=$(bc <<< "$after-$before") zxc=$(echo "$res * 8 * 100 / (1000000000 * 3) " | bc) per=$(echo "scale=1; 100 * $zxc / (1000) " | bc) # 可自定义结果输出逻辑,示例为打印接口编号和利用率 echo "接口$line 带宽利用率: $per%" } # 逐行读取接口并启动后台处理任务 while read line; do # 过滤空行 [ -z "$line" ] && continue calc_port_util "$line" & done < intfile.txt # 等待所有后台任务执行完成 wait
注意事项
- 如果intfile.txt里接口数量较多(比如超过50个),建议增加并发数控制,避免同时发起太多SNMP请求被设备拒绝,可借助
xargs -P参数限制并发数,比如限制最多10个并发的写法参考:
cat intfile.txt | xargs -I {} -P 10 bash -c ' before=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$0 | awk "{print \$4}") sleep 3 after=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$0 | awk "{print \$4}") res=$(bc <<< "$after-$before") zxc=$(echo "$res * 8 * 100 / (1000000000 * 3) " | bc) per=$(echo "scale=1; 100 * $zxc / (1000) " | bc) echo "接口$0 带宽利用率: $per%" ' {}
- 若需要将结果写入统一文件,使用
>> 结果文件路径追加写入即可,避免多进程同时写入出现内容覆盖问题。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

