openwrt 网络检测脚本

背景

openwrt 有些固件不太稳定,会时不时的断网,导致家里无法上网,遇到这种情况只能手动重启openwrt设备,该操作不方便,作为一个极客爱好者,那肯定是要实现自动化处理的了,写一个简单的脚本加入到crontab定时任务中,就可完全自动化检测了,解放双手。

脚本思路

1、ping指定域名5次,只要要有2次以上的包响应,才表示网络畅通
2、如果低于2次,则视为网络不通,重启网络,并等待20秒
3、再次检测网络如果还是网络不通的话,则重启openwrt服务
4、当连续失败计数大道10次以上,则重启次数改为10分钟,重复上述步骤,当网络畅通后,计数归零

脚本

#!/bin/bash  # ping的域名 DOMAIN=baidu.com # 连续计数 NETWORK_CHECK_COUNTER_FILE="/data/shell/log/network-check-counter.log" # 执行日志 NETWORK_CHECK_LOG_FILE="/data/shell/log/network-check.log" # 默认计数为0 COUNTER=0  # 连续失败计数大于该数值,则进行 RESTART_INTERVAL 秒等待,再执行重新检测 COUNTER_THRESHOLD=10 # 持续失败,后默认等待时间(秒),然后再重启 RESTART_INTERVAL=600  # 检查文件是否存在,如果不存在则创建文件 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 check_network {     # 如果ping 5次至少有2次包未响应,则执行一下代码     if ! ping -c 5 $DOMAIN > /dev/null 2>&1; then         # 如果无法连接网络,则重启网络         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 -c 5 $DOMAIN > /dev/null 2>&1; then             # 如果仍无法连接网络,则重启OpenWrt服务             echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接仍然失败,重启OpenWrt服务"             echo "$(date '+%Y-%m-%d %H:%M:%S') 网络连接仍然失败,重启OpenWrt服务" >>$NETWORK_CHECK_LOG_FILE             /etc/init.d/openwrt-service restart             echo "$(date '+%Y-%m-%d %H:%M:%S') OpenWrt服务已重启"             echo "$(date '+%Y-%m-%d %H:%M:%S') OpenWrt服务已重启" >>$NETWORK_CHECK_LOG_FILE             echo $(($(cat $NETWORK_CHECK_COUNTER_FILE) + 1)) >$NETWORK_CHECK_COUNTER_FILE         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') 网络连接正常"         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 # 等待         check_network     else         check_network     fi }  check_counter  echo "$(date '+%Y-%m-%d %H:%M:%S') network 检查完毕"  

部署

1、将该脚本放在openwrt任意一个目录,我这里是放在 /data/shell/目录下
2、添加执行权限 chomd +x ./network-check.sh
3、执行crontab -ecrontab 中追加一行 */2 * * * * /data/shell/network-check.sh 2分钟执行一次检测
4、添加完成后,我们在openwrt后台的计划任务列表里面就可以看到了,也可以直接通过计划任务列表去添加
openwrt 网络检测脚本

发表评论

相关文章