linux中networkmanager无原生故障自愈机制,但可通过nmcli配合dispatcher脚本或systemd定时任务实现连通性检测与自动恢复:一、确认connectivity-check启用;二、用/etc/networkmanager/dispatcher.d/脚本监听connectivity-change事件触发重连;三、备用轮询方案通过systemd timer定期执行修复脚本。

Linux 中 NetworkManager 本身不提供原生的“故障自愈”机制,但可以通过 nmcli 配合系统级工具(如 systemd 定时任务、cron 或 NetworkManager-dispatcher 脚本)实现连通性检测 + 自动恢复动作。所谓“Connectivity-Check”,是指 NetworkManager 内置的联网状态探测能力(默认启用),它会定期向 http://connectivity-check.ubuntu.com/(或发行版指定 URL)发起 HTTP HEAD 请求,用于判断是否真正接入互联网(而不仅是本地网络通)。这个结果会影响 nmcli general connectivity 输出和 GUI 网络图标状态。
要基于此实现轻量级自动恢复(例如:检测失连后尝试重连、重启连接、切换配置),关键不是“改 nmcli 命令”,而是监听其状态变化并触发修复逻辑。
以下是可落地的三步方案:
一、确认 NetworkManager 连通性检查已启用并生效
NetworkManager 默认开启该功能,但需确保:
-
检查当前连通性级别:
nmcli general connectivity
返回
full/limited/none——none表示检测失败(可能 DNS、路由、防火墙或目标 URL 不可达)。 -
查看实际探测配置(Ubuntu/Debian 默认用 Ubuntu 的 URL;RHEL/CentOS 可能用
redhat.com):grep -i connectivity /etc/NetworkManager/NetworkManager.conf
若无输出,说明使用默认值;如有,确认
connectivity-uri指向一个你网络可达的 HTTP 端点(如http://1.1.1.1/cdn-cgi/trace)。 -
强制刷新检测(不重启服务):
sudo systemctl reload NetworkManager
二、利用 NetworkManager dispatcher 实现事件驱动恢复
/etc/NetworkManager/dispatcher.d/ 下的脚本会在网络状态变更时被自动调用(如 up、down、pre-up、connectivity-change)。这是最可靠、无需轮询的方式。
创建一个自愈脚本(例如 /etc/NetworkManager/dispatcher.d/99-auto-heal):
#!/bin/bash
# 当 connectivity 变为 none 时,尝试重启当前活跃连接
if [ "$2" = "connectivity-change" ] && [ "$(nmcli -g CONNECTIVITY general)" = "none" ]; then
# 获取当前活跃的有线/无线连接名
ACTIVE_CONN=$(nmcli -t -f NAME,DEVICE c s --active | grep -E '^(eth|en|wl)' | cut -d: -f1 | head -n1)
if [ -n "$ACTIVE_CONN" ]; then
logger "NM dispatcher: connectivity lost → restarting connection '$ACTIVE_CONN'"
nmcli connection down "$ACTIVE_CONN" 2>/dev/null
sleep 2
nmcli connection up "$ACTIVE_CONN" 2>/dev/null
fi
fi
赋予执行权限并测试:
sudo chmod +x /etc/NetworkManager/dispatcher.d/99-auto-heal sudo systemctl restart NetworkManager
✅ 优势:零轮询、低开销、事件精准;❌ 局限:仅响应 NM 主动检测到的
connectivity-change,不覆盖物理断线未上报场景。
三、补充:手动轮询 + 修复(适合调试或 dispatcher 不可用时)
若 dispatcher 不适用(如受限环境),可用 systemd timer 每 30 秒检查一次:
-
创建检查脚本
/usr/local/bin/nm-connectivity-heal.sh:#!/bin/bash if ! nmcli -g CONNECTIVITY general | grep -q "full"; then logger "Connectivity check failed → triggering heal" # 尝试重新激活所有 ethernet/wifi 连接 for conn in $(nmcli -t -f NAME,TYPE c s | grep -E ':(ethernet|wifi)$' | cut -d: -f1); do nmcli c up "$conn" 2>/dev/null && break done fi -
创建 systemd timer:
# /etc/systemd/system/nm-heal.timer [Unit] Description=NM Connectivity Auto-Heal Timer [Timer] OnUnitActiveSec=30s Persistent=true [Install] WantedBy=timers.target
# /etc/systemd/system/nm-heal.service [Unit] Description=NM Connectivity Auto-Heal Service After=NetworkManager.service [Service] Type=oneshot ExecStart=/usr/local/bin/nm-connectivity-heal.sh
-
启用:
sudo systemctl daemon-reload sudo systemctl enable --now nm-heal.timer
⚠️ 注意:避免高频触发(如
),防止干扰正常 DHCP 获取或路由收敛。
不复杂但容易忽略——真正的自愈不在 nmcli 命令本身,而在把它嵌入系统事件流或定时上下文中。











