systemd 控制服务启动顺序需使用 after 和 before 字段。1. wants= 表示软依赖,目标服务未启动不影响当前服务;2. requires= 表示硬依赖,目标服务必须成功启动;3. after= 指定当前服务在其之后启动的目标服务;4. before= 指定当前服务在其之前启动的目标服务;5. 建议配合使用 wants 和 after 避免滥用 requires;6. 可通过 systemctl list-dependencies 查看依赖关系;7. 配置时避免循环依赖,否则 systemd 会报错。

在用 systemd 管理服务的时候,控制服务的启动顺序是个常见需求。比如数据库得先启动,应用服务才能连接上。Systemd 本身有一套依赖机制来处理这个问题,但如果不了解它的逻辑,容易配错或者误以为“重启就能好”。

理解 Wants 和 Requires
Systemd 中最基础的依赖关系是 Wants= 和 Requires=,它们都定义在 service 文件的 [Unit] 段中。

-
Wants=是软依赖:如果它指向的服务没启动成功,不影响当前服务。 -
Requires=是硬依赖:目标服务必须启动成功,否则当前服务也不会被启动。
这两个字段只表示“依赖哪些服务”,不直接控制启动顺序。也就是说,如果你只是加了 Wants=xxx.service,systemd 不保证这个服务会在你当前服务之前启动。
控制启动顺序靠的是 After 和 Before
真正决定启动顺序的是 After= 和 Before= 字段。比如你想让 A 服务在 B 之后启动,就在 A 的 service 文件里加上:

After=B.service
反过来如果你想让 A 在 B 前面启动,就给 A 加:
Before=B.service
通常做法是两者配合使用。例如:
# a.service [Unit] After=b.service # b.service [Unit] Before=a.service
虽然只写一个也能生效,但双向声明更清晰、不容易出错。
实际配置建议和注意事项
- 别滥用 Requires:除非服务必须存在,否则优先用 Wants + After。
-
跨层级依赖要小心:比如某个服务依赖网络,可以设置
After=network-online.target,同时加上Wants=network-online.target。 - 循环依赖会报错:比如 A 要在 B 后启动,B 又要在 A 后启动,systemd 会拒绝加载。
-
查看依赖关系可以用命令:
-
systemctl list-dependencies your-service systemctl list-dependencies --reverse your-service
-
总结一下怎么操作
举个例子:假设你有一个 webapp 服务,它需要等 mysql 启动后再启动。
-
编辑 webapp.service 文件:
sudo systemctl edit webapp.service
-
添加如下内容:
[Unit] Wants=mysql.service After=mysql.service
-
重载 systemd 配置:
sudo systemctl daemon-reload
-
重启或启动服务验证:
sudo systemctl restart webapp
基本上就这些。理解清楚 Wants/Requires 和 After/Before 的区别,再按需配置,就能控制好服务的启动顺序了。










