应使用 Wants=network-online.target + After=network-online.target,并启用 systemd-networkd-wait-online.service 或 NetworkManager-wait-online.service;仅写 After 不够,必须搭配 Wants 才能确保真正等待网络就绪。

在 Linux 中,要让某个自定义服务或脚本在网络就绪(比如网卡已获取 IP、路由可达)之后才启动,关键不是“等网络服务启动”,而是明确告诉 systemd:这个服务依赖网络功能可用。不同场景下,有直接、可靠且兼容性好的做法。
用 systemd 的 After + Wants 实现网络就绪依赖
systemd 本身不提供“网络完全就绪”的原生目标,但提供了两个广泛支持的 target:
- network.target:表示网络基础服务(如 NetworkManager 或 network.service)已启动,但不保证网卡已配好 IP;
- network-online.target:表示至少一个网络接口已成功获取 IP 并能进行基本通信(如 ping 通网关),这才是真正“网络就绪”的信号。
推荐在服务单元文件中这样写:
[Unit] Description=My App Service After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/usr/local/bin/myapp Restart=on-failure [Install] WantedBy=multi-user.target
⚠️ 注意:仅写 After=network-online.target 不够——必须加上 Wants=network-online.target,否则 systemd 可能跳过等待,直接启动你的服务。
确保 network-online.target 能真正生效
这个 target 是否可靠,取决于底层网络管理服务是否“通知”了它。常见情况:
- 使用 NetworkManager:默认会激活
NetworkManager-wait-online.service,该服务负责探测并触发network-online.target,通常开箱即用; - 使用传统 network.service(如 CentOS 7 的 ifup/ifdown):需确认
network.service单元中包含WantedBy=network-online.target,否则该 target 永远不会被触发; - 使用 systemd-networkd:需启用
systemd-networkd-wait-online.service,运行:sudo systemctl enable systemd-networkd-wait-online.service
验证是否生效:重启后执行 systemctl is-active network-online.target,返回 active 才算到位。
对老旧系统或特殊需求:加简单健康检查
如果发现 network-online.target 触发过早(例如 DHCP 延迟导致 IP 尚未分配完),可在 ExecStart 前加轻量级等待逻辑:
ExecStart=/bin/sh -c 'until ping -c1 -w3 192.168.1.1 &>/dev/null; do sleep 2; done; /usr/local/bin/myapp'
更稳妥的做法是封装成独立脚本,避免把逻辑堆在 unit 文件里。注意别用 ping google.com,应优先检测网关或 DNS 服务器这类局域网内可控地址。
不推荐绕过 systemd 直接改 rc.local
虽然 /etc/rc.local 看似简单,但它在多数现代发行版中属于兼容层,启动时机不可控,且不参与依赖图谱——无法保证在网络就绪后执行,还可能被 SELinux 或安全策略拦截。systemd 单元方式才是标准、可审计、可调试的正解。


















