OpenWrt计划任务实现天翼网关自动化重启
1. 为什么需要自动化重启天翼网关
家里用天翼网关的朋友可能都遇到过这样的问题:用着用着网速就变慢了,打开管理页面一看内存占用都快爆表了。官方提供的管理界面和小翼管家App里明明有定时重启功能,但设置后就是不生效,简直让人抓狂。作为一个折腾网络多年的老玩家,我发现定期重启网关确实能显著提升网络稳定性,特别是对于7×24小时运行的设备来说。
天翼网关本质上也是一台小型Linux设备,长时间运行后难免会出现内存泄漏、连接数堆积等问题。我在实际测试中发现,连续运行两周不重启的网关,内存占用能飙升到90%以上,这时候就会出现网页加载慢、视频卡顿、游戏延迟高等各种问题。而手动重启虽然能解决问题,但谁记得住每天凌晨去按那个小小的重启按钮呢?
2. OpenWrt计划任务系统简介
OpenWrt作为一款强大的路由器操作系统,其内置的Cron计划任务系统就是我们实现自动化重启的利器。这个系统源自Unix/Linux的经典任务调度工具,可以精确到分钟级别执行各种任务。我特别喜欢它的灵活性,你可以设置每天、每周、每月甚至更复杂的时间规则。
在OpenWrt上,计划任务有两种配置方式:一种是直接编辑/etc/crontab文件,另一种是通过Web管理界面中的"系统-计划任务"来可视化配置。考虑到易用性,我建议新手先从Web界面入手,等熟悉了再尝试直接编辑配置文件。不过无论哪种方式,底层原理都是一样的,都是通过cron守护进程来执行我们设定的任务。
3. 准备重启脚本
3.1 脚本编写要点
要让OpenWrt能够控制天翼网关重启,我们需要编写一个能够模拟登录网关管理页面并触发重启操作的Shell脚本。这个脚本的核心是使用curl命令与网关的Web接口进行交互。经过多次测试和调整,我总结出了最稳定的脚本版本:
#!/bin/sh GW_IP="192.168.1.1" # 改为你的网关IP USERNAME="user" # 改为你的用户名 PASSWORD="pass" # 改为你的密码 # 登录获取cookies和token login_resp=$(curl -s -L "http://${GW_IP}/cgi-bin/luci" \ -X POST \ -c /tmp/gw_cookies.txt \ -d "username=${USERNAME}&psd=${PASSWORD}") # 提取token token=$(echo "${login_resp}" | sed 's/{/\n/g' | grep token | awk '/realRestart/{print $2}' | sed $'s/\'//g') # 执行重启 reboot_resp=$(curl -s -b /tmp/gw_cookies.txt \ "http://${GW_IP}/cgi-bin/luci/admin/reboot" \ --data "token=${token}") # 检查结果 if [ $? -eq 0 ]; then logger -t "天翼网关重启" "重启指令发送成功" else logger -t "天翼网关重启" "重启失败,请检查网络连接" fi这个脚本比原始版本增加了错误处理和日志记录功能,使用logger命令将执行结果写入系统日志,方便后续排查问题。
3.2 脚本部署步骤
- 使用SSH连接到OpenWrt路由器(推荐使用Putty或Termius)
- 创建脚本文件:
touch /usr/bin/tyReboot.sh - 编辑脚本:
vi /usr/bin/tyReboot.sh - 按
i进入编辑模式,粘贴上述脚本内容 - 修改IP地址、用户名和密码为你网关的实际信息
- 按
ESC退出编辑模式,输入:wq保存退出 - 赋予执行权限:
chmod +x /usr/bin/tyReboot.sh
这里有个小技巧:如果你不熟悉vi编辑器,可以先在本地电脑上用文本编辑器写好脚本,然后使用scp命令上传到路由器:
scp tyReboot.sh root@路由器IP:/usr/bin/4. 配置计划任务
4.1 通过Web界面配置
对于新手来说,通过OpenWrt的Web界面配置计划任务是最简单的方式:
- 登录OpenWrt管理页面(通常是http://192.168.1.1)
- 导航到"系统"→"计划任务"
- 在文本框中添加以下内容:
59 5 * * * sleep 60 && /usr/bin/tyReboot.sh- 点击"提交"保存设置
这行配置的意思是每天凌晨5:59分执行任务,先等待60秒,然后运行我们的重启脚本。为什么要加sleep 60?这是为了避免整点执行时可能出现的网络拥塞问题。
4.2 直接编辑crontab
如果你更喜欢命令行方式,可以直接编辑crontab:
# 编辑root用户的crontab crontab -e在打开的文件末尾添加同样的任务行,保存退出即可。OpenWrt会自动加载新的配置,无需重启服务。
5. 测试与排错
5.1 手动测试脚本
在设置自动任务前,强烈建议先手动测试脚本是否正常工作:
# 手动执行脚本 /usr/bin/tyReboot.sh # 查看执行日志 logread | grep "天翼网关重启"如果看到"重启指令发送成功"的日志,同时观察到天翼网关确实重启了,说明脚本工作正常。
5.2 常见问题排查
- 脚本权限问题:确保脚本有可执行权限(chmod +x)
- curl命令缺失:如果报错curl找不到,需要安装curl包:
opkg update && opkg install curl - 登录失败:检查IP、用户名和密码是否正确,特别是注意密码中的特殊字符
- token提取失败:天翼网关的Web接口可能会更新,需要调整sed/awk命令
我在实际部署时遇到过最棘手的问题是网关固件升级后API接口变了,导致脚本失效。这时候需要重新分析网页源码,调整token提取逻辑。建议每隔几个月检查一次脚本是否仍然有效。
6. 进阶优化建议
6.1 增加随机延迟
如果你有多台设备都需要定时重启,可以考虑增加随机延迟,避免所有设备同时重启导致网络波动:
# 在0-300秒之间随机延迟 RAND_DELAY=$((RANDOM % 300)) 59 5 * * * sleep $RAND_DELAY && /usr/bin/tyReboot.sh6.2 添加执行条件
可以进一步优化脚本,只在网关内存使用率过高时才执行重启:
#!/bin/sh # 获取网关内存使用率 mem_usage=$(curl -s "http://${GW_IP}/cgi-bin/luci/admin/status" | grep "内存使用" | awk '{print $3}' | tr -d '%') # 只在内存使用超过80%时重启 if [ "$mem_usage" -gt 80 ]; then # 原有的重启逻辑 fi6.3 邮件通知功能
如果你想收到重启成功的通知,可以集成邮件发送功能。首先安装邮件工具:
opkg update opkg install msmtp然后在脚本中添加发送邮件的代码。这样每次网关重启后,你都能收到确认邮件,真正做到心中有数。
