You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:45:03