You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu系统WiFi随时间恶化,寻求无需明文存储root密码的NetworkManager自动化重启方案

Ubuntu系统WiFi随时间恶化,寻求无需明文存储root密码的NetworkManager自动化重启方案

遇到过类似的WiFi卡顿问题,确实手动重启NetworkManager能快速恢复,但天天手动操作太麻烦。下面几个方案都不需要明文存储root密码,你可以根据自己的需求选:

方案1:通过sudoers配置免密执行重启命令(最简单的个人用户方案)

这个方法允许你的普通用户无需输入密码就能执行指定的重启命令,然后配合cron定时运行:

  1. 编辑sudoers文件(一定要用visudo,避免语法错误导致sudo失效):
    打开终端执行:
    sudo visudo
    
  2. 添加免密权限:
    在文件末尾添加一行,把your_username替换成你实际的Ubuntu用户名:
    your_username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart NetworkManager
    
    保存退出(visudo里按Ctrl+O保存,Ctrl+X退出)。
  3. 测试免密命令:
    直接执行:
    sudo systemctl restart NetworkManager
    
    如果不需要输入密码就执行成功,说明配置生效了。
  4. 设置cron定时任务:
    打开用户级cron编辑:
    crontab -e
    
    添加一行,设置每天午夜执行:
    0 0 * * * sudo /usr/bin/systemctl restart NetworkManager
    
    保存退出即可。

方案2:用systemd定时器(更符合现代Ubuntu的系统级方案)

如果你的Ubuntu版本比较新(16.04及以上),用systemd定时器更规范,不需要依赖用户的cron,属于系统级定时任务:

  1. 创建重启NetworkManager的service文件:
    用文本编辑器创建/etc/systemd/system/restart-networkmanager.service(需要sudo权限):
    [Unit]
    Description=自动重启NetworkManager以修复WiFi卡顿问题
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/systemctl restart NetworkManager
    
  2. 创建定时器文件:
    同样创建/etc/systemd/system/restart-networkmanager.timer:
    [Unit]
    Description=每日定时重启NetworkManager的定时器
    
    [Timer]
    # 设置每天午夜执行,格式是 时:分 日/月/周
    OnCalendar=daily
    # 如果系统在定时时间处于关机状态,开机后会补执行一次
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    
  3. 启用并启动定时器:
    执行以下命令:
    sudo systemctl daemon-reload
    sudo systemctl enable --now restart-networkmanager.timer
    
    可以用systemctl list-timers查看定时器是否生效。

方案3:智能监控WiFi速度,低于阈值时自动重启(更灵活的方案)

如果不想固定时间重启,而是当WiFi真的变慢时再触发,可以写个简单的监控脚本:

  1. 安装speedtest-cli(用来测试网络速度):
    sudo apt install speedtest-cli
    
  2. 编写监控脚本:
    创建~/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
    
  3. 给脚本添加执行权限:
    chmod +x ~/wifi-monitor.sh
    
  4. 配置sudo免密(同方案1):
    确保你的用户可以免密执行systemctl restart NetworkManager,然后设置cron每10分钟检查一次:
    crontab -e
    
    添加:
    */10 * * * * ~/wifi-monitor.sh
    

注意事项

  • 方案1中,sudoers的配置一定要精确到具体命令,不要给用户过大的免密权限,避免安全风险。
  • 方案2的systemd定时器是系统级的,即使你的用户没登录也会执行,适合服务器或者多用户环境。
  • 方案3的speedtest-cli可能会消耗少量流量,如果你的流量有限,可以调整检查间隔或者换用本地测速的方式(比如ping网关)。

备注:内容来源于stack exchange,提问作者FooBar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 11:40:27