首页/系统/信创系统运维速查/单元依赖与启动顺序
服务与运维65 条

单元依赖与启动顺序

systemd 用 Wants/Requires 表达依赖、After/Before 表达顺序:依赖决定拉不拉、顺序决定先后。排查启动链问题用 list-dependencies 与关键链分析。

信创系统运维速查系统更新于 2026-10-13

依赖与顺序的区别

systemd 用两组关键字描述单元之间的关系:Wants 与 Requires 决定要不要拉起目标单元,After 与 Before 只决定启动的先后顺序。依赖决定拉不拉,顺序决定谁先谁后,两者要分开写。排查启动链问题时,用 list-dependencies 看清关系再用关键路径分析。

基本信息

弱依赖Wants:尝试拉起目标,失败不阻塞自身
强依赖Requires:目标必须成功
顺序After 与 Before,仅控制先后
查看依赖systemctl list-dependencies 单元
查看属性systemctl show 单元 -p Wants -p Requires

典型使用场景

  • 自定义服务需要在网络就绪后再启动
  • 应用依赖数据库,要求数据库先起
  • 排查启动失败:确认是依赖未启动还是自身报错
  • 调整启动顺序以缩短开机时间
  • 梳理互相依赖的单元,找出循环依赖

查看依赖

查看依赖
systemctl list-dependencies myapp.service          # 正向依赖树
systemctl list-dependencies --reverse myapp.service   # 谁依赖它
systemctl show myapp -p Wants -p Requires -p After -p Before   # 查看关键属性
systemctl list-dependencies multi-user.target | head -20       # 看目标拉起的单元
systemctl status myapp --no-pager | head -12       # 看实际启动结果与报错
journalctl -u myapp -n 30 --no-pager               # 结合日志确认失败点

关键键对照

键含义目标失败时
Wants弱依赖,尝试拉起目标不阻塞自身启动
Requires强依赖,目标必须启动成功自身不会启动
After仅规定先后顺序无影响
Before反向顺序控制无影响
BindsTo比强依赖更紧的绑定目标停止时自身也停止

配置要点

  • 需要网络就绪时同时写依赖与顺序
  • 避免无谓的强依赖,减少连带失败
  • 启动顺序变化后回归验证
  • 用反向依赖查询评估改动影响
  • 把单元关系记入部署文档
只写顺序不写依赖是半配置:仅仅声明先后不会把目标单元拉起来,需要网络就绪的场景要把弱依赖与顺序一起写上。

排查启动链问题

  • 先用反向依赖确认改动的影响范围
  • 再用关键路径找出真正的阻塞点
  • 结合日志确认失败的具体单元
  • 必要时校验单元语法是否合法

易错点

  • 只写顺序不写依赖:目标单元可能根本没被启动,服务在网络就绪前就运行并失败
  • 滥用强依赖:目标失败会连带自身不启动,故障范围被放大,非必需时优先用弱依赖
  • 出现循环依赖:启动时报订单循环错误,用 list-dependencies 逐层梳理依赖链
  • 改动依赖后不做回归:启动顺序变化可能影响其他服务,改完要在测试环境完整重启验证
  • 只看单元文件注解就判断关系:实际生效关系要用 show 与 list-dependencies 查看
  • 改完单元不重新加载:改动需要重载或重启才生效,改完要核对实际生效的依赖关系

数据来源与参考

  • man 5 systemd.unit(Wants/Requires/After/Before)
  • 红帽系统管理指南(systemd 依赖)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌