linux服务启动失败主因是依赖缺失或错误,需用systemctl list-dependencies查正/反向依赖,检查requires/wants服务状态,识别隐式依赖如network-online.target,修改后daemon-reload并验证。

Linux服务启动失败,常因依赖缺失或依赖关系错误。排查核心是理清服务启动顺序、检查依赖单元、验证依赖项状态。
查看服务依赖关系
使用 systemctl list-dependencies 查看服务的显式依赖:
- 正向依赖(需要哪些服务): systemctl list-dependencies --reverse nginx.service —— 查哪些服务依赖 nginx
- 反向依赖(依赖哪些服务): systemctl list-dependencies --all nginx.service —— 显示 Requires、Wants、BindsTo 等所有依赖项
- 加 --type=service 可过滤仅显示服务类型依赖,避免混入 target 或 socket
检查依赖服务是否启用并运行
依赖项即使存在,若未启用(enable)或未运行(active),仍会导致目标服务启动失败:
- 逐个检查 list-dependencies 输出中的关键服务: systemctl is-active sshd.service、systemctl is-enabled network.target
- 重点关注标为 Requires= 的单元(强依赖,任一失败则本服务不启动);Wants= 是弱依赖,不影响启动但建议也处于 active 状态
- 若发现依赖服务 inactive,先尝试启动:systemctl start dependent.service;若失败,需递归排查该服务自身依赖
识别隐式依赖与启动时机问题
有些依赖不写在 service 文件中,而是由 target(如 multi-user.target)或挂载点(.mount)、网络就绪(network-online.target)等隐式触发:
- 用 systemctl show nginx.service | grep -E "(WantedBy|RequiredBy|After|Before)" 查看启动时序约束
- 常见陷阱:服务需要网络但只 After=network.target(仅表示网卡已加载),应改用 After=network-online.target 并添加 Wants=network-online.target
- 若服务读取远程 NFS 或数据库,还需确认对应 .mount 或 socket 单元已就绪,可用 systemctl list-units --type=mount 检查挂载状态
修复依赖配置与重载服务
修改依赖后必须重载 systemd 配置才能生效:
- 编辑服务文件:sudo systemctl edit --full nginx.service(推荐使用 --full 避免覆盖风险)
- 在 [Unit] 段添加或修正:
Requires=redis-server.service
Wants=network-online.target
After=network-online.target redis-server.service - 保存后执行:sudo systemctl daemon-reload,再试启动:sudo systemctl start nginx.service
- 验证修复效果:systemctl status nginx.service 查看日志末尾是否有 dependency-related 错误










