家里那台老款华三ER3200G2,跑着自定义的QoS限速脚本,每天凌晨自动重载策略——你猜靠什么实现?不是手动点,是循环。
循环不是写给电脑看的,是写给网络节奏看的
路由器内存小、CPU弱,没法像PC那样开一堆进程盯着每条连接。它得用最省劲的方式反复检查:端口有没有新设备接入?带宽占用超没超阈值?某个IP是不是又在刷视频?这些事不能只做一遍,得持续盯梢。循环就是那个不眨眼的值班员。
一个真实的OpenWrt shell循环片段
比如限制某台手机白天只能用500Kbps:
while true; do
if [ $(date +%H) -ge 7 -a $(date +%H) -lt 22 ]; then
tc class change dev br-lan parent 1:1 classid 1:10 htb rate 500kbit
else
tc class change dev br-lan parent 1:1 classid 1:10 htb rate 2mbit
fi
sleep 60
done这段代码不会执行完就退出,而是每分钟醒来一次,根据当前时间动态调整限速值。没有循环,策略就成了一锤子买卖——早上设好,中午失效,晚上没人管。
别小看那个sleep 60
有人试过把sleep改成sleep 1,结果CPU飙到95%,WiFi断连频发。循环不是越快越好,是卡准节奏:检测间隔要大于策略生效延迟,又要短于业务波动周期。家用路由器上,10秒到3分钟之间最稳。你家光猫后台那个“自动重启”开关,背后也是个定时循环在数秒。
再举个接地气的例子
孩子用iPad打《原神》,你设了游戏优先策略。但游戏服务器会换IP、UDP端口也飘着走。单次抓包匹配只能管5秒。真正起效的是这个循环:
for i in {1..10}; do
iptables -t mangle -A PREROUTING -s 192.168.1.100 -p udp --dport 10000:65535 -j MARK --set-mark 10
sleep 3
done它不是赌一次命中,而是连续10轮扫描,覆盖掉大部分动态端口变化窗口。循环在这里,是把“碰运气”变成“稳落地”的关键齿轮。