Orange Pi网络中断检测bash脚本优化:缩短netcat超时时间
解决Orange Pi网络看门狗脚本中超时过长的问题
嘿,我完全懂你的困扰——30秒的超时延迟对于WiFi收音机来说实在太影响体验了,断网后得等半分钟才能检测到,这显然不符合实时性需求。咱们来一步步优化这个脚本:
1. 给netcat添加超时参数
你的netcat命令默认没有设置超时时间,所以才会等30秒。不同版本的nc(netcat)参数略有差异,你可以根据你的Orange Pi上的版本选择:
GNU netcat(大部分Linux发行版默认)
用-w参数设置超时时间(单位:秒),比如设置2秒超时:
if nc -w 2 google.com 80 > /dev/null 2>&1; then # 网络正常逻辑 sig_state=1 else # 断网逻辑 sig_state=0 fi
BSD netcat(部分嵌入式系统可能用这个)
用-t参数设置超时,比如同样2秒:
if nc -t 2 google.com 80 > /dev/null 2>&1; then sig_state=1 else sig_state=0 fi
2. 更快的替代方案:用ping检测
相比建立TCP连接的netcat,ping只需要ICMP包,检测速度更快。你可以设置只发1个包,超时1秒,这样几乎能瞬间判断网络状态:
if ping -c 1 -W 1 8.8.8.8 > /dev/null 2>&1; then # 网络正常:点亮LED、维持连接 sig_state=1 # 这里可以加LED点亮命令,比如echo 1 > /sys/class/leds/orangepi:red/brightness else # 断网:闪烁LED、尝试重连WiFi sig_state=0 # LED闪烁示例:echo 0 > /sys/class/leds/orangepi:red/brightness; sleep 0.5; echo 1 > ... # 重连WiFi命令,比如nmcli connection up "你的WiFi名称" 或者 ifdown wlan0 && ifup wlan0 fi
注意:有些网络可能禁用ICMP(ping),这时还是得用netcat,但这种情况很少见,对于家用路由器来说完全没问题。
3. 优化完整脚本示例
结合你的需求,这里给一个完整的优化版脚本,包含状态检测、LED反馈和重连逻辑:
#!/bin/bash # 配置参数 WIFI_INTERFACE="wlan0" LED_PATH="/sys/class/leds/orangepi:red/brightness" CHECK_INTERVAL=5 # 每5秒检测一次 TIMEOUT=2 # 检测超时时间 sig_state=1 # 初始假设网络正常 echo "Network Watchdog ON" echo "..." # 初始化LED状态 echo 1 > $LED_PATH while true; do # 用netcat检测网络(如果ping不行就用这个) if nc -w $TIMEOUT google.com 80 > /dev/null 2>&1; then if [ $sig_state -eq 0 ]; then # 网络从断连恢复 echo "Network restored!" echo 1 > $LED_PATH # 点亮LED sig_state=1 fi else if [ $sig_state -eq 1 ]; then # 网络从正常变为断连 echo "Network lost! Attempting to reconnect..." sig_state=0 # 尝试重连WiFi ifdown $WIFI_INTERFACE sleep 2 ifup $WIFI_INTERFACE fi # 断网时LED闪烁 echo 0 > $LED_PATH sleep 0.5 echo 1 > $LED_PATH sleep 0.5 fi sleep $CHECK_INTERVAL done
这个脚本做了这些优化:
- 缩短了检测超时时间
- 只在状态变化时执行重连和日志输出,避免重复操作
- 断网时LED闪烁提醒,恢复后常亮
- 可配置的参数,方便根据你的硬件调整
内容的提问来源于stack exchange,提问作者andowt
相关产品推荐
相关产品推荐

