前言
- 最近在项目中,需要实现 ROS2 程序的开机自启动,并在运行过程中持续保持网络连接的稳定性。尽管已在
NetworkManager中配置了自动连接(AutoConnect)及优先级策略,
bash
nmcli connection modify "CMCC-wQ2u-5G" connection.autoconnect yes
nmcli connection modify "CMCC-wQ2u-5G" connection.autoconnect-priority 100
- 但在实际应用场景中仍无法完全满足网络异常恢复的需求,因此撰写本文进行补充说明与实现。
- 本文介绍两种用于实现断网自动重连的方案,分别基于
systemd与crontab,用于在不同系统环境下实现网络监控与自动恢复机制。
1 systemd
1-1 介绍
systemd是 Linux 系统中广泛使用的初始化系统与服务管理框架,用于在系统启动过程中并行管理各类服务,并在运行期间对服务进行统一调度与监控。- 相比传统的
cron定时任务机制,systemd更适用于长期运行的守护进程场景,具备以下特点:- 支持服务的自动启动与依赖管理
- 可配置异常退出自动重启(Restart 机制)
- 提供统一的日志管理(journald)
- 能够基于系统状态进行服务调度(如网络就绪后启动)
- 因此,在需要实现网络监控、自恢复机制或 ROS2 节点长期运行的场景中,
systemd通常是更稳定且更工程化的解决方案。
1-2 断网重连脚本
- 创建脚本文件,用来写断网检测和自动修复逻辑。
bash
nano /home/lzh/postgraduate0/net_reconnect.sh
- 脚本核心逻辑,用来检测网络并在异常时自动重连 WiFi。
- 大致的逻辑就是:
先 ping 判断网络是否正常 → 不正常就尝试开 WiFi → 重连热点 → 失败就重启
NetworkManager
bash
#!/bin/bash
TARGET="8.8.8.8"
WIFI_NAME="CMCC-wQ2u-5G"
WIFI_PW="******"
echo "==== $(date) ===="
# =========================
# 检查 WiFi 是否关闭
# =========================
WIFI_STATE=$(nmcli radio wifi)
if [ "$WIFI_STATE" = "disabled" ]; then
echo "[INFO] WiFi is OFF, turning ON..."
nmcli radio wifi on
sleep 2
fi
# =========================
# 解锁 rfkill(防止 unavailable)
# =========================
rfkill unblock wifi
# =========================
# ping 测试
# =========================
ping -c 3 -W 2 $TARGET > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[FAIL] Network down"
echo "[ACTION] connecting WiFi: $WIFI_NAME"
# =========================
# 直接连接 WiFi
# =========================
nmcli device wifi rescan
sleep 2
nmcli device wifi connect "$WIFI_NAME" password "$WIFI_PW"
# =========================
# 如果失败,重启 NetworkManager
# =========================
if [ $? -ne 0 ]; then
echo "[WARN] connect failed, restarting NetworkManager"
systemctl restart NetworkManager
fi
echo "[DONE] recovery finished"
else
echo "[OK] Network fine"
fi
1-3 创建 systemd 服务
- 新建 service 文件,把脚本注册成系统后台服务。
bash
sudo nano /etc/systemd/system/net-reconnect.service
- 定义服务依赖关系,确保网络准备好后再启动
bash
[Unit]
Description=WiFi Auto Recovery Service
After=network-online.target NetworkManager.service
Wants=network-online.target
[Service]
Type=simple
User=root
ExecStart=/home/lzh/postgraduate0/net_reconnect.sh
Restart=always
RestartSec=10
# 关键:解决 nmcli / dbus 权限问题
Environment=DBUS_SYSTEM_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket
[Install]
WantedBy=multi-user.target
[Unit]:定义服务的基本信息以及启动依赖关系。Description:描述(注释)After:指定服务启动顺序,确保在网络就绪以及 NetworkManager 启动完成后再执行本服务。Wants:声明对网络就绪状态的弱依赖,用于尽可能保证在网络可用时启动服务。
[Service]:定义服务的具体运行方式与执行行为。Type:指定服务为前台运行模式,systemd 直接跟踪主进程。User:指定服务以 root 权限运行,以确保具备网络管理权限ExecStart:指定服务启动时执行的脚本路径。Restart:配置服务在退出或异常终止后自动重启。RestartSec:设置重启延迟时间,避免频繁重启导致系统负载过高。
Environment=DBUS_SYSTEM_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket: 设置 DBus 系统总线地址,解决nmcli在 systemd 环境下可能出现的权限或通信问题。[Install]:定义服务的安装与自启动方式。WantedBy:表示服务将在系统进入多用户运行级别时自动启动。
1-4 加载 systemd、设置开机自启、立即启动测试
bash
sudo systemctl daemon-reload
sudo systemctl enable net-reconnect.service
sudo systemctl start net-reconnect.service

1-5 查看状态
- 查看服务当前是否正常运行以及是否有报错。
bash
systemctl status net-reconnect.service

1-6 看运行日志
- 实时查看服务运行日志,用来排查问题。
bash
journalctl -u net-reconnect.service -f

- 这时候你手动关闭wifi,可以在日志里头看到输出,以及
wifi自动重新连接
1-7 停止服务
- 当需要临时关闭或彻底停止该自愈服务时,可以通过 systemd 进行管理。
bash
sudo systemctl stop net-reconnect.service
- 如果需要禁止其开机自动启动,可以执行:
bash
sudo systemctl disable net-reconnect.service
- 如果需要彻底移除该服务,可以删除 service 文件:
bash
sudo rm /etc/systemd/system/net-reconnect.service
sudo systemctl daemon-reload
2 crontab
2-1 介绍
crontab是 Linux 中用于周期性执行任务的定时任务工具,适用于简单的脚本调度与周期性检查场景。- 相比
systemd,crontab不具备服务管理能力,也无法提供自动重启与统一日志系统,但配置简单、适合轻量级任务执行。 - 因此在本项目中,
crontab作为一种基础方案,用于实现周期性网络状态检测与自动修复尝试
2-2 断网重连脚本
- crontab 执行任务时不会像 systemd 一样集中管理日志,因此需要手动写入日志文件进行记录。
bash
nano /home/lzh/postgraduate0/net_reconnect.sh
- 该脚本逻辑与 systemd 版本基本一致,主要用于周期性检测网络状态并尝试恢复连接。
bash
#!/bin/bash
TARGET="8.8.8.8"
WIFI_NAME="CMCC-wQ2u-5G"
WIFI_PW="*****"
LOG="/home/lzh/net_reconnect.log"
echo "==== $(date) ====" >> $LOG
# =========================
# 检查 WiFi 是否关闭
# =========================
WIFI_STATE=$(nmcli radio wifi)
if [ "$WIFI_STATE" = "disabled" ]; then
echo "[INFO] WiFi is OFF, turning ON..." >> $LOG
nmcli radio wifi on >> $LOG 2>&1
sleep 2
fi
# =========================
# 解锁 rfkill(防止 unavailable)
# =========================
rfkill unblock wifi >> $LOG 2>&1
# =========================
# ping 测试
# =========================
ping -c 3 -W 2 $TARGET > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[FAIL] Network down" >> $LOG
echo "[ACTION] connecting WiFi: $WIFI_NAME" >> $LOG
# =========================
# 直接连接 WiFi
# =========================
nmcli device wifi rescan >> $LOG 2>&1
sleep 2
nmcli device wifi connect "$WIFI_NAME" password "$WIFI_PW" >> $LOG 2>&1
# =========================
# 如果失败,重启 NetworkManager
# =========================
if [ $? -ne 0 ]; then
echo "[WARN] connect failed, restarting NetworkManager" >> $LOG
systemctl restart NetworkManager
fi
echo "[DONE] recovery finished" >> $LOG
else
echo "[OK] Network fine" >> $LOG
fi
2-3 crontab启动配置
- 通过 crontab 设置定时任务,使脚本周期性执行
bash
sudo crontab -e

- 选择默认编辑器(通常选择 vim 或 nano)。
bash
select-editor
2-3-1 关于是否使用 sudo 的区别
crontab -e(不带 sudo) 表示编辑当前普通用户的定时任务,只对当前用户生效。sudo crontab -e表示编辑 root 用户的定时任务,任务以 root 权限执行。
2-4 添加crontab启动项
- 在出现的编辑器中添加如下部分:
bash
*/1 * * * * /home/lzh/postgraduate0/net_reconnect.sh

- 该表达式是 cron 的时间格式,由 5 个字段组成,分别表示:
bash
分 时 日 月 周 命令
-
在这里
*/1 * * * **/1:每 1 分钟执行一次(分钟级循环)
- 后面的
*:表示"小时 / 日期 / 月 / 星期"全部匹配
需要注意的是ron 支持的最小执行时间单位是 1 分钟
2-5 查看crontab配置
- 用于确认定时任务是否成功写入系统。
bash
sudo crontab -l

2-6 查看脚本是否在运行
- cron 没有统一日志系统,需要通过系统日志判断是否执行。
- 查看最近 cron 执行记录,用于确认任务是否按周期运行。
bash
grep CRON /var/log/syslog | tail -20

2-7 查看日志
- 由于 crontab 不提供统一日志输出,因此需要依赖手动写入的 log 文件进行分析。
- 通过查看
/home/lzh/net_reconnect.log可以确认网络状态变化与修复过程。

2-8 停止服务
- 当不再需要周期性执行该脚本时,可以通过编辑 crontab 或直接清空任务来停止执行。
bash
sudo crontab -e
- 进入编辑界面后,删除或注释掉对应的任务行即可:
bash
# */1 * * * * /home/lzh/postgraduate0/net_reconnect.sh
- 如果需要彻底清空当前用户的所有 crontab 任务,可以使用:
bash
如果需要彻底清空当前用户的所有 crontab 任务,可以使用:
总结
- 本文分别介绍了基于
systemd与crontab的两种网络自愈实现方案,并通过脚本与配置示例实现了对 ROS2 运行环境中断网问题的自动检测与恢复机制。
systemd更适合用于长期运行的服务型守护进程,具备更强的稳定性与系统级管理能力;而crontab则适用于轻量级周期性检测任务,配置简单但功能相对有限。
- 如有错误,欢迎指出!
- 感谢观看!
