必须同时配置after和requires,因为after仅控制时序而不触发依赖启动,requires仅确保依赖存在但不保证顺序;二者缺一不可才能实现“先等它起来、再轮到我”的可靠启动语义。

要让自定义服务按预期顺序可靠启动,After 和 Requires 必须成对出现——只写其中一个,系统既无法保证依赖服务被拉起,也无法确保启动时序。
为什么必须同时配置 After 和 Requires?
单独写 After=postgresql.service,systemd 只记住“我比它晚启动”,但不会主动去启动 PostgreSQL;如果 PostgreSQL 没运行,你的服务可能直接连接失败。单独写 Requires=postgresql.service,systemd 会尝试并行拉起两个服务,你的服务可能在数据库还没完成初始化时就已开始读取连接池,造成超时或报错。
只有两者共存,才能实现“先等它起来、再轮到我”的完整语义。
典型配置场景与写法
数据库强依赖(最常见)
Requires=postgresql.serviceAfter=postgresql.service
多服务串联依赖(如 B→C→A)
监控 Victron Energy 电力系统,生成包含电池状态、光伏发电量和活动警报的精美每日邮件报告。集成 Vic...
- A.service 中写:
Requires=C.service和After=C.service - C.service 中写:
Requires=B.service和After=B.service
网络+数据库混合依赖
-
Wants=network-online.target(网络可选,不阻断) After=network-online.targetRequires=postgresql.serviceAfter=postgresql.service
配置后必须做的两件事
修改完 .service 文件后:
- 运行
sudo systemctl daemon-reload,让 systemd 重新加载配置 - 用
systemctl list-dependencies --reverse your-service.service查看反向依赖树,确认 B → C → A 的链路是否真实建立
别踩这些坑
network-online.target 的常见误用:只写 After=network-online.target 而不配 Wants= 或 Requires=,systemd 不会等待网络真正就绪,服务可能在 DHCP 还没拿到 IP 时就启动了。
混淆 Wants 和 Requires:日志归档类服务可用 Wants=rsyslog.service + After=rsyslog.service,避免因 rsyslog 临时异常导致自身无法启动。
不复杂但容易忽略的是:所有这些参数都必须写在同一个 [Unit] 段里,跨段无效,也不存在“全局依赖”这种写法。










