核心目标是确保网络相关服务在真实网络就绪后启动:network.target仅表示网络服务已启动,而network-online.target才表示IP已分配、路由可达;应优先使用Requires=network-online.target+After=network-online.target以实现可靠依赖。

Linux 网络服务启停管理中,使用 systemd 配置依赖的核心目标是:让网络相关服务(如自定义应用、数据库代理、监控采集器等)在真实网络就绪后才启动,并确保其不早于关键基础设施(如网卡配置、DNS、防火墙)就绪。这不能只靠 After=network.target,因为该 target 仅表示“网络子系统已加载”,并不保证 IP 地址已分配或路由可达。
明确 network.target 与 network-online.target 的区别
systemd 提供两个常用网络相关 target,语义不同:
- network.target:表示网络基础服务(如 systemd-networkd 或 ifupdown)已启动,但接口可能尚未获取 IP 或未连通——适合对网络连通性无强要求的服务(如本地日志转发)
- network-online.target:表示至少一个网络接口已完成地址配置且能响应 ping(由 systemd-networkd-wait-online.service 或 NetworkManager-wait-online.service 触发),适合依赖实际连通性的服务(如 API 网关、远程数据库客户端)
若你的服务需访问外网或依赖 DNS 解析,应优先使用 Requires=network-online.target + After=network-online.target,而非仅用 After=network.target。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
为自定义服务添加可靠网络依赖
以 /etc/systemd/system/myapp.service 为例,在 [Unit] 段中配置:
- 若服务必须等待网络真正可用才启动(失败即中止):
Requires=network-online.targetAfter=network-online.target - 若服务可尝试启动,即使网络暂时不可用(如带重试逻辑的客户端):
Wants=network-online.targetAfter=network-online.target - 避免常见错误:单独写
After=network-online.target而不配Wants或Requires,systemd 不会自动触发等待逻辑,可能导致服务抢在网卡配置完成前启动
处理 NetworkManager 与传统 network 服务的兼容性
多数现代发行版默认启用 NetworkManager,而部分服务器仍用传统 network 服务。二者互斥,不能同时运行。配置依赖前请确认当前系统使用哪一套:
- 检查状态:
systemctl is-active NetworkManager或systemctl is-active network - 若使用 NetworkManager,其自带
NetworkManager-wait-online.service会激活network-online.target;若使用传统network服务,需确保systemd-networkd-wait-online.service已启用,或手动在network.service中添加WantedBy=network-online.target - 服务单元中无需硬编码
Wants=NetworkManager.service,应统一通过标准 target(network-online.target)抽象,提升可移植性
验证与调试依赖是否生效
配置完成后,务必验证实际行为是否符合预期:
- 查看服务启动顺序和依赖链:
systemctl list-dependencies --reverse myapp.service,确认network-online.target出现在依赖列表中 - 模拟网络延迟启动测试:临时禁用
systemd-networkd-wait-online.service或修改其TimeoutSec=,观察myapp.service是否被阻塞或报错 - 检查启动耗时:
systemd-analyze plot > boot.svg,打开 SVG 查看myapp.service是否确实排在网络就绪之后 - 查看实时日志:
journalctl -u myapp.service -u systemd-networkd-wait-online.service -n 50 -f,确认服务是否在 wait-online 完成后才开始 ExecStart

















