背景

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
# 持续失败,判断crontab是否在等待处理
RESTART_NEXTtIME_FILE="/data/shell/log/network_check_sleep.log" # 检查文件是否存在,如果不存在则创建文件
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 网络检测脚本的更多相关文章

  1. SSRF——weblogic vulhub 漏洞复现及攻击内网redis(一)(附批量检测脚本)

    0X01 概述 SSRF(Server-Side Request Forgery, 服务端请求伪造)利用漏洞可以发起网络请求来攻击内网服务.利用SSRF能实现以下效果:1)        扫描内网(主 ...

  2. Windows操作系统安全加固基线检测脚本

    一.背景信息 在我们的安全运维工作中经常需要进行安全基线配置和检查,所谓的安全基线配置就是系统的最基础的安全配置,安全基线检查涉及操作系统.中间件.数据库.甚至是交换机等网络基础设备的检查,面对如此繁 ...

  3. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  4. Python编写的Linux网络设置脚本,Debian Wheezy上测试通过

    hon编写的Linux网络设置脚本,Debian Wheezy上测试通过       阿里百川梦想创业大赛,500万创投寻找最赞的APP 技术细节参见Linux网络设置高级指南 注意事项参见程序注释 ...

  5. JAVA平台上的网络爬虫脚本语言 CrawlScript

    JAVA平台上的网络爬虫脚本语言 CrawlScript 网络爬虫即自动获取网页信息的一种程序,有很多JAVA.C++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个 ...

  6. Redis + keepalived 高可用行配置检测脚本

    Redis 在生产配置中:除redis集群.哨兵模式之外:主从模式还是比较普遍的. 配置 redis 多主从:由 keepalived 做 VIP 地址漂移.可以实现redis的高可用性. keepa ...

  7. WinForm多线程实现HTTP网络检测工具

    一.背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WinForm.本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高 ...

  8. 【javascript】浏览器用户代理检测脚本实现

    以下是完整的用户代理字符串检测脚本,包括检测呈现引擎.平台.Windows操作系统.移动设备和游戏系统. var client = function(){ // 呈现引擎 var engine = { ...

  9. Python写网络后台脚本

    Python写网络后台脚本. 首先安装Python3.6.5,在centos中自带的Python是2.6版本的,现在早就出现了3.6版本了况且2和3 之间的差距还是比较大的,所以我选择更新一下Pyth ...

  10. ios - 高效,准确的网络检测

    //网络检测 // 1.创建网络监听者管理者对象 AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager share ...

随机推荐

  1. 基于opencv实现简单人脸检测

    作用:在视频中自动检测出人脸 使用内容:灰度转换,分类器,矩形框选,圆形框选,摄像头读取及释放 代码逻辑: 先读取摄像头后, 对摄像头拍摄到的图片进行逐帧分析, 并对图像进行灰度转换后使用类选择器识别 ...

  2. BIO和NIO的区别和原理

    BIO BIO(Blocking IO) 又称同步阻塞IO,一个客户端由一个线程来进行处理 当客户端建立连接后,服务端会开辟线程用来与客户端进行连接.以下两种情况会造成IO阻塞: 服务端会一直阻塞,直 ...

  3. 看起来简单实际上却很牛的KMP算法:LeetCode572-另一棵树的子树

    题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 暴力解法 从 ...

  4. LeetCode HOT 100:最大子数组和

    题目:53. 最大子数组和 题目描述: 给你一个整数数组,在该数组的所有子数组中,找到一个子数组中所有元素相加和最大,返回这个最大的和.子数组就是一个数组中,由一个或几个下标连续的元素,组成的小数组, ...

  5. Jmeter在结果树中查看响应数据为空

    今天遇到了一个比较尴尬的问题,吭哧吭哧了大半天,后来咨询了开发SO的一下解决了. 问题: 在调用接口时取样器结果中显示response code:200, response message:OK,但是 ...

  6. python之路35 MySQL 3 字段的约束条件 外键关系

    字段约束条件 无符号.零填充 unsigned id int unsigned zerofill id int(5) zerofill 非空 create table t1( id int, name ...

  7. 买不到的数目【第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组】

    买不到的数目 小明开了一家糖果店. 他别出心裁:把水果糖包成4颗一包和7颗一包的两种. 糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合. 当然有些糖果数目是无法组合出来的,比如要买 10 ...

  8. LVGL 中图片使用问题

    此笔记主要是记录在 LVGL 中使用图片的几种方式,以及使用过程中遇到的问题.最近在 ARM linux 中使用 LVGL 时,发现加载图片变得很卡,一开始还好,当连续加载的图片变多后,特别是动画的过 ...

  9. P8775 [蓝桥杯 2022 省 A] 青蛙过河

    简要题意 有一只青蛙在 \(1\) 处,有一些石头,位于 \(2,3,4,\cdots n\),它们的高度是 \(H_2,H_3,\cdots,H_n\).青蛙每落一次石头,该石头的高度就会 \(-1 ...

  10. 初始化一个GCP项目并用gcloud访问操作

    1 简介 谷歌云GCP(Google Cloud Platform)是由Google提供的云平台,还是为用户提供了许多免费的产品,还是可以尝试一下的.对于学习或者小项目,都可以使用. 2 创建一个新项 ...