journalctl 不记录服务依赖关系,但可通过日志时序、单元状态和错误关键词反向还原依赖链;结合 systemctl 分析依赖图后,定向查询各单元启动日志与失败信号,快速定位依赖瓶颈。

journalctl 本身不直接记录“服务依赖关系”这一逻辑结构,它记录的是实际发生的事件流。但你可以通过组合日志字段、时间上下文和服务启动顺序,反向还原依赖行为——这才是生产环境中真正有效的排查路径。
看服务启动时序,推断依赖触发链
systemd 启动服务时严格遵循 Wants、Requires、After 等声明,这些关系会转化为实际的启动动作并被 journald 捕获。关键不是查配置文件,而是看谁先启动、谁因谁失败:
- 查看某次启动中所有服务的启动顺序:
journalctl -b | grep "Started\|Starting\|Failed to start" - 聚焦目标服务及其前置依赖(比如 nginx 启动前通常有 network.target、local-fs.target):
journalctl -b --since "5 minutes before nginx started" -u nginx.service -u systemd-networkd.service -u systemd-udevd.service - 用时间偏移定位依赖失败点:若
postgres.service启动失败,紧接着app.service报 “dependency failed”,就说明依赖未满足
用 _SYSTEMD_UNIT 和 MESSAGE 关联上下游日志
一个服务启动失败,往往不是自身代码问题,而是它等待的另一个单元没准备好。journalctl 支持跨单元关联:
- 查某个服务启动失败时,同时拉出它所依赖单元的日志:
journalctl -b _SYSTEMD_UNIT=app.service PRIORITY=3(错误级),再补查journalctl -b _SYSTEMD_UNIT=redis.service对应时间段 - 搜索典型依赖拒绝消息:
journalctl -b | grep -E "(dependency.*failed|timed out|refused|connection refused)" - 结合进程 PID 追踪:如果 app.service 启动时尝试连接 redis,失败日志里常带
connect: Connection refused,此时用_PID=查该连接尝试所属进程,再查其父单元
配合 systemctl 分析依赖图后定向查日志
先用 systemctl 明确依赖结构,再用 journalctl 验证执行结果:
- 列出某服务的直接依赖:
systemctl list-dependencies --reverse nginx.service(反向查谁依赖它),或systemctl list-dependencies --all nginx.service(展开全部) - 对每个依赖单元,单独查其本次启动表现:
for unit in $(systemctl list-dependencies --reverse --plain nginx.service); do echo "== $unit =="; journalctl -b -u "$unit" -n 10 --no-pager; done - 重点检查状态为
inactive (dead)或failed的依赖单元,它们的日志头几行通常就是失败原因
识别常见依赖失败信号
不用逐行读,盯住这几类关键词就能快速定位瓶颈:
-
超时类:
Timed out waiting for、start operation timed out、dependency failed on -
资源类:
No such file or directory(挂载点未就绪)、Permission denied(SELinux 或权限阻断)、Address already in use(端口冲突) -
网络类:
Connection refused、Network is unreachable、getaddrinfo failed -
单元状态类:
Unit XXX.service not found(拼写错误)、Unit XXX.service is masked(被禁用)、Unit XXX.service is inactive(未启用自动启动)











