Ubuntu系统WiFi随时间恶化,寻求无需明文存储root密码的NetworkManager自动化重启方案
Ubuntu系统WiFi随时间恶化,寻求无需明文存储root密码的NetworkManager自动化重启方案
遇到过类似的WiFi卡顿问题,确实手动重启NetworkManager能快速恢复,但天天手动操作太麻烦。下面几个方案都不需要明文存储root密码,你可以根据自己的需求选:
方案1:通过sudoers配置免密执行重启命令(最简单的个人用户方案)
这个方法允许你的普通用户无需输入密码就能执行指定的重启命令,然后配合cron定时运行:
- 编辑sudoers文件(一定要用visudo,避免语法错误导致sudo失效):
打开终端执行:sudo visudo - 添加免密权限:
在文件末尾添加一行,把your_username替换成你实际的Ubuntu用户名:
保存退出(visudo里按your_username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart NetworkManagerCtrl+O保存,Ctrl+X退出)。 - 测试免密命令:
直接执行:
如果不需要输入密码就执行成功,说明配置生效了。sudo systemctl restart NetworkManager - 设置cron定时任务:
打开用户级cron编辑:
添加一行,设置每天午夜执行:crontab -e
保存退出即可。0 0 * * * sudo /usr/bin/systemctl restart NetworkManager
方案2:用systemd定时器(更符合现代Ubuntu的系统级方案)
如果你的Ubuntu版本比较新(16.04及以上),用systemd定时器更规范,不需要依赖用户的cron,属于系统级定时任务:
- 创建重启NetworkManager的service文件:
用文本编辑器创建/etc/systemd/system/restart-networkmanager.service(需要sudo权限):[Unit] Description=自动重启NetworkManager以修复WiFi卡顿问题 [Service] Type=oneshot ExecStart=/usr/bin/systemctl restart NetworkManager - 创建定时器文件:
同样创建/etc/systemd/system/restart-networkmanager.timer:[Unit] Description=每日定时重启NetworkManager的定时器 [Timer] # 设置每天午夜执行,格式是 时:分 日/月/周 OnCalendar=daily # 如果系统在定时时间处于关机状态,开机后会补执行一次 Persistent=true [Install] WantedBy=timers.target - 启用并启动定时器:
执行以下命令:
可以用sudo systemctl daemon-reload sudo systemctl enable --now restart-networkmanager.timersystemctl list-timers查看定时器是否生效。
方案3:智能监控WiFi速度,低于阈值时自动重启(更灵活的方案)
如果不想固定时间重启,而是当WiFi真的变慢时再触发,可以写个简单的监控脚本:
- 安装speedtest-cli(用来测试网络速度):
sudo apt install speedtest-cli - 编写监控脚本:
创建~/wifi-monitor.sh,内容如下(把MIN_SPEED改成你能接受的最低速度,单位是Mbps):#!/bin/bash MIN_SPEED=10 # 最低可接受的WiFi速度(Mbps) # 测试当前下载速度,取整数部分 CURRENT_SPEED=$(speedtest-cli --simple | grep Download | awk '{print $2}' | cut -d. -f1) if [ "$CURRENT_SPEED" -lt "$MIN_SPEED" ]; then echo "$(date): WiFi速度过低(${CURRENT_SPEED}Mbps),重启NetworkManager..." >> ~/wifi-restart.log sudo systemctl restart NetworkManager fi - 给脚本添加执行权限:
chmod +x ~/wifi-monitor.sh - 配置sudo免密(同方案1):
确保你的用户可以免密执行systemctl restart NetworkManager,然后设置cron每10分钟检查一次:
添加:crontab -e*/10 * * * * ~/wifi-monitor.sh
注意事项
- 方案1中,sudoers的配置一定要精确到具体命令,不要给用户过大的免密权限,避免安全风险。
- 方案2的systemd定时器是系统级的,即使你的用户没登录也会执行,适合服务器或者多用户环境。
- 方案3的speedtest-cli可能会消耗少量流量,如果你的流量有限,可以调整检查间隔或者换用本地测速的方式(比如ping网关)。
备注:内容来源于stack exchange,提问作者FooBar
相关产品推荐
相关产品推荐

