Share

OpenWrt 断网自动重启脚本

#!/bin/sh
# 自动检查线路是否正常,不正常就重启 Openwrt 重新拨号

PING=`ping -c 5 202.96.128.86|grep -v grep|grep '64 bytes' |wc -l`
if [ ${PING} -ne 0 ];then
    exit 0
else
    /etc/init.d/network restart
fi
sleep 10

PING2=`ping -c 5 202.96.128.86|grep -v grep|grep '64 bytes' |wc -l`
if [ ${PING2} -ne 0 ];then
    exit 0
else
    reboot
fi

还有一个代日志的

#!/bin/bash

# 日志默认目录
Log_DIR="/data/shell/log"
# 连续计数
NETWORK_CHECK_COUNTER_FILE="${Log_DIR}/network-check-counter.log"
# 执行日志
NETWORK_CHECK_LOG_FILE="${Log_DIR}/network-check.log"
# 默认计数为0
COUNTER=0

# 连续失败计数大于该数值,则进行 RESTART_INTERVAL 秒等待,再执行重新检测
COUNTER_THRESHOLD=10
# 持续失败,后默认等待时间(秒),然后再重启
RESTART_INTERVAL=600

# 检查目录是否存在,不存在则创建
if [ ! -d "$Log_DIR" ]; then
    echo "Creating directory $Log_DIR"
    mkdir -p "$Log_DIR"
fi

# 检查文件是否存在,如果不存在则创建文件
touch $NETWORK_CHECK_LOG_FILE

if [ ! -e $NETWORK_CHECK_COUNTER_FILE ]; then
    touch $NETWORK_CHECK_COUNTER_FILE
    echo "0" >$NETWORK_CHECK_COUNTER_FILE
fi
COUNTER=$(cat $NETWORK_CHECK_COUNTER_FILE)

# 检测网络是否畅通
function ping_domain() {
    # ping的域名或者DNS
    local domain=114.114.114.114
    # ping的次数
    local tries=6
    # 请求成功次数
    local packets_responded=0

    for i in $(seq 1 $tries); do
        if ping -c 1 $domain >/dev/null; then
            ((packets_responded++))
            sleep 1
        fi
    done

    # 如果请求成功总次数大于2,则表示成功
    if [ $packets_responded -ge 2 ]; then
        echo "true"
    else
        echo "false"
    fi
}

# 检测网络连接函数
function check_network() {
    # 如果ping 6次至少有2次包未响应,则执行一下代码
    if [ $(ping_domain) = "false" ]; then
        # 如果N无法连接网络,则重启网络
        echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接失败"
        echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接失败" >>$NETWORK_CHECK_LOG_FILE
        /etc/init.d/network restart
        sleep 20
        if [ $(ping_domain) = "false" ]; then
            # 如果仍无法连接网络,则重启WLAN服务
            echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接仍然失败,重启WLAN服务"
            echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接仍然失败,重启WLAN服务" >>$NETWORK_CHECK_LOG_FILE

            /sbin/ifup wan
            echo "$(date '+%Y-%m-%d %H:%M:%S') Wlan服务已重启"
            echo "$(date '+%Y-%m-%d %H:%M:%S') Wlan服务已重启" >>$NETWORK_CHECK_LOG_FILE
            echo $(($(cat $NETWORK_CHECK_COUNTER_FILE) + 1)) >$NETWORK_CHECK_COUNTER_FILE
            sleep 30

            if [ $(ping_domain) = "false" ]; then
                echo "$(date '+%Y-%m-%d %H:%M:%S') 重启WLAN后,联网失败,准备重启服务器"
                echo "$(date '+%Y-%m-%d %H:%M:%S') 重启WLAN后,联网失败,准备重启服务器" >>$NETWORK_CHECK_LOG_FILE
                echo $(($(cat $NETWORK_CHECK_COUNTER_FILE) + 1)) >$NETWORK_CHECK_COUNTER_FILE
                /sbin/reboot
            else
                echo "$(date '+%Y-%m-%d %H:%M:%S') 重启WLAN后,连接已恢复"
                echo "$(date '+%Y-%m-%d %H:%M:%S') 重启WLAN后,连接已恢复" >>$NETWORK_CHECK_LOG_FILE
                echo "0" >$NETWORK_CHECK_COUNTER_FILE
            fi
        else
            echo "$(date '+%Y-%m-%d %H:%M:%S') 重启网络网络后,连接已恢复"
            echo "$(date '+%Y-%m-%d %H:%M:%S') 重启网络网络后,连接已恢复" >>$NETWORK_CHECK_LOG_FILE
            echo "0" >$NETWORK_CHECK_COUNTER_FILE
        fi
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接正常"
        # 可以通过server 酱发送消息
        #if [ $(cat $NETWORK_CHECK_COUNTER_FILE) -ge 1 ]; then
        # 如果网络畅通且之前有失败计数,则进行POST请求
        #echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接已恢复,发送POST请求"
        #echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接已恢复,发送POST请求" >>$NETWORK_CHECK_LOG_FILE
        # 使用curl发送POST请求到 http://aaa.com
        # curl -X POST http://baidu.com
        #fi
        echo "0" >$NETWORK_CHECK_COUNTER_FILE
    fi
}

# 计数器检查函数
function check_counter() {
    COUNTER=$(cat $NETWORK_CHECK_COUNTER_FILE)
    if [[ $COUNTER -ge $COUNTER_THRESHOLD ]]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') 计数器值大于等于 $COUNTER_THRESHOLD ,等待 $RESTART_INTERVAL 秒后重新检测网络连接"
        echo "$(date '+%Y-%m-%d %H:%M:%S') 计数器值大于等于 $COUNTER_THRESHOLD ,等待 $RESTART_INTERVAL 秒后重新检测网络连接" >>$NETWORK_CHECK_LOG_FILE
        sleep $RESTART_INTERVAL # 等待
        echo "$(date '+%Y-%m-%d %H:%M:%S') 等待 $RESTART_INTERVAL 秒后,开始重新检测网络" >>$NETWORK_CHECK_LOG_FILE
        check_network
    else
        check_network
    fi
}

check_counter

echo "$(date '+%Y-%m-%d %H:%M:%S') network 检查完毕"

 

不支持中文的话可以用这个

#!/bin/sh
tries=0
logger "my network watchdog start"
while [[ $tries -lt 5 ]]
do
        if /bin/ping -c 1 8.8.8.8 >/dev/null
        then
            logger "network pass, exit."
            exit 0
        fi
        tries=$((tries+1))
        sleep 10
done
logger "network error, restart network"
/etc/init.d/network restart

 

 

 

添加执行权限 chomd +x ./network-check.sh 或 chomd 777 network-check.sh
执行crontab -ecrontab 中追加一行 */2 * * * * /data/shell/network-check.sh 2分钟执行一次检测
添加完成后,我们在openwrt后台的计划任务列表里面就可以看到了,也可以直接通过计划任务列表去添加

我使用的如下代码

#!/bin/sh

PING=`ping -c 5 8.8.8.8|grep -v grep|grep '64 bytes' |wc -l`
if [ ${PING} -ne 0 ];then
    exit 0
else
    /etc/init.d/network restart
fi
sleep 10

PING2=`ping -c 5 8.8.8.8|grep -v grep|grep '64 bytes' |wc -l`
if [ ${PING2} -ne 0 ];then
    exit 0
else
    reboot
fi