主代码
- 创建network_check.sh文件,放置/usr/local/bin/目录下
- 需要懂一点shell脚本编写技术,脚本代码如下
#!/bin/bash
# 系统级网络监控脚本 v3.0
# 执行路径: /usr/local/bin/network_check.sh
# 作者: A媓哟
# 版本: 3.8
# 最后更新: 2025-10-08
# 定义核心参数
TARGETS=(
"baidu.com" # 公网DNS测试
"bing.com" # 国际连通性测试
"192.168.126.1" # 内网网关1
"192.168.126.2" # 内网网关2
)
LOG_FILE="/var/log/network_check.log" # 日志绝对路径
MAX_SIZE=$((15 * 1024 * 1024)) # 15MB阈值(字节单位)
MAX_RETRY=2 # 最大重试次数
CHECK_INTERVAL=30 # 检测间隔(秒)
# 日志清理函数
clean_log() {
local current_size=$(stat -c%s "$LOG_FILE") # 获取当前文件大小
if [ "$current_size" -gt "$MAX_SIZE" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [LOG] 日志文件超过15MB,执行截断操作" >> "$LOG_FILE"
truncate -s 0 "$LOG_FILE" # 安全截断文件
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 日志文件已清空" >> "$LOG_FILE"
fi
}
# 延迟启动函数
delayed_start() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 延迟启动中..." >> "$LOG_FILE"
sleep 30 # 等待系统初始化完成
}
# 网络检测主逻辑
detect_network() {
local failure_count=0
for target in "${TARGETS[@]}"; do
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 进入循环..."
# 执行带超时的ping检测
/bin/ping -c 3 -W 2 $target &> /dev/null
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 完成ping..."
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [OK] 连通至 $target" >> "$LOG_FILE"
return 0 # 检测成功立即退出
else
echo "$(date '+%Y-%m-%d %H:%M:%S') [FAIL] 无法连接 $target" >> "$LOG_FILE"
((failure_count++))
fi
done
# 判断是否达到重启条件
if [ $failure_count -ge ${#TARGETS[@]} ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [**] 所有目标不可达,重启NetworkManager" >> "$LOG_FILE"
/bin/systemctl restart NetworkManager
return 1
fi
return 0
}
# 主程序入口
main() {
clean_log # 执行日志清理检
delayed_start # 执行延迟启动
for ((attempt=1; attempt<=MAX_RETRY; attempt++)); do
echo "第 $attempt 次检测尝试..."
if detect_network; then
echo "网络检测成功,退出脚本"
exit 0
else
echo "第 $attempt 次检测失败"
if [ $attempt -lt $MAX_RETRY ]; then
echo "等待 $CHECK_INTERVAL 秒后重试..."
sleep $CHECK_INTERVAL # 等待指定时间后再次检测
fi
fi
done
echo "已达到最大重试次数 ($MAX_RETRY),脚本终止"
exit 1
}
# 执行主程序
main
定时运行
- 在crontab定时计划下方添加代码
2 * * * * root /usr/local/bin/network_check.sh >/dev/null 2>&1
- 保持后就可以摆烂了,最迟2分钟恢复系统服务,想要快点自己删除延迟和循环,一分钟一次即可