自动检测网络状态并在断网时重启OpenWRT路由器

moonjerx
2024-09-18 / 0 评论 / 235 阅读 / 正在检测是否收录...

在家庭网络环境中,路由器偶尔会出现断网的情况。为了避免手动重启路由器带来的不便,可以通过编写一个脚本来自动检测网络状态并在断网时重启路由器。本文将详细介绍如何在OpenWRT路由器上实现这一功能。

前提条件

  1. 已安装OpenWRT固件。
  2. 路由器支持SSH,并且已开启SSH服务。
  3. 路由器的SSH端口已知(默认为22,本文假设已修改为20022)。

实现步骤

1. 创建脚本

首先,在OpenWRT路由器上创建一个新的脚本,用于检测网络状态并在必要时重启路由器。

#!/bin/sh

# 配置文件路径
CONF_LAST_DOWN_TIME="/usr/share/netcheck/last_down_time.conf"
CONF_HAS_REBOOT="/usr/share/netcheck/has_reboot.conf"

NETWORK_DOWN_THRESHOLD=300

# 创建配置文件如果它不存在
if [ ! -f "$CONF_LAST_DOWN_TIME" ]; then
    touch "$CONF_LAST_DOWN_TIME"
    echo "LAST_DOWN_TIME=" > "$CONF_LAST_DOWN_TIME"
fi
if [ ! -f "$CONF_HAS_REBOOT" ]; then
    touch "$CONF_HAS_REBOOT"
    echo "HAS_REBOOT=0" > "$CONF_HAS_REBOOT"
fi

# 设置要检测的目标(这里使用 www.baidu.com)
PING_TARGET="www.baidu.com"

# 获取当前时间戳
CURRENT_TIME=$(date +%s)

# 读取配置文件中的值
source "$CONF_LAST_DOWN_TIME"
source "$CONF_HAS_REBOOT"

# 检查是否网络断开
if ! ping -c 1 $PING_TARGET > /dev/null 2>&1; then
    if [ -z "$LAST_DOWN_TIME" ]; then
        logger "[CK-Net] Network is down since $(date)"
        # 如果LAST_DOWN_TIME为空值,则记录当前时间
        echo "LAST_DOWN_TIME=$CURRENT_TIME" > "$CONF_LAST_DOWN_TIME"
    else
        # 已经记录了断开时间,计算断开时间长度
        NETWORK_DOWN_TIME=$((CURRENT_TIME-LAST_DOWN_TIME))

        # 如果断开时间超过阈值,并且 HAS_REBOOT 为 0,则重启路由器
        if [ $NETWORK_DOWN_TIME -ge $NETWORK_DOWN_THRESHOLD ] && [ $HAS_REBOOT -eq 0 ]; then
            # 清除断开时间记录
            echo "LAST_DOWN_TIME=" > "$CONF_LAST_DOWN_TIME"
            logger "[CK-Net] Network has been down for more than $((NETWORK_DOWN_TIME / 60)) minutes. Restarting router..."
            echo "HAS_REBOOT=1" > "$CONF_HAS_REBOOT"
            reboot
        else
            logger "[CK-Net] Network has been down for $((NETWORK_DOWN_TIME / 60)) minutes."
        fi
    fi
else
    # 网络恢复正常,清除断开时间记录
    if [ -n "$LAST_DOWN_TIME" ]; then
        logger "[CK-Net] Network is up again."
        echo "LAST_DOWN_TIME=" > "$CONF_LAST_DOWN_TIME"
        echo "HAS_REBOOT=0" > "$CONF_HAS_REBOOT"
    fi
fi

2. 设置执行权限

确保脚本文件具有执行权限:

chmod +x /usr/share/netcheck/netcheck.sh

3. 设置定时任务

设置一个定时任务来定期执行这个脚本。

  1. 编辑crontab
crontab -e
  1. 添加定时任务
    在打开的编辑器中,添加一行来指定定时任务的频率。例如,每分钟执行一次脚本:
* * * * * /usr/share/netcheck/netcheck.sh
  1. 保存并退出
    保存并退出编辑器。此时,定时任务就已经设置好了。

注意事项

  • 日志记录:您可以在脚本中加入日志记录功能,以便追踪脚本的执行情况。例如:

    logger "Network check script executed at $(date)"
    • 可以使用日志查看命令
    logread | grep CK
  • 网络延迟:考虑到网络可能存在短暂的不稳定,可以在脚本中增加重试机制,以避免因瞬时的网络波动而导致不必要的重启。例如,可以尝试多次ping,确保网络确实断开后再执行重启操作。
  • 安全性:确保路由器的SSH访问是安全的,并且只允许受信任的设备访问。
  • 频繁重启的影响:频繁重启路由器可能会对硬件造成损害,因此请调整检测间隔和重启逻辑,确保不会频繁重启。

通过以上步骤,您可以在OpenWRT路由器上设置一个定时任务,定期检查网络状态,并在断网超过2分钟后自动重启路由器。这种方法可以有效地减少因短暂网络波动而导致的不必要的重启操作。

0

评论 (0)

取消

您的IP: