依赖与顺序的区别
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 | 比强依赖更紧的绑定 | 目标停止时自身也停止 |
配置要点
- 需要网络就绪时同时写依赖与顺序
- 避免无谓的强依赖,减少连带失败
- 启动顺序变化后回归验证
- 用反向依赖查询评估改动影响
- 把单元关系记入部署文档
只写顺序不写依赖是半配置:仅仅声明先后不会把目标单元拉起来,需要网络就绪的场景要把弱依赖与顺序一起写上。
排查启动链问题
- 先用反向依赖确认改动的影响范围
- 再用关键路径找出真正的阻塞点
- 结合日志确认失败的具体单元
- 必要时校验单元语法是否合法