
Linux服务依赖异常通常表现为服务启动失败、状态显示为 inactive (dead) 或报错提示“dependency failed”“unit not found”等。核心原因往往是被依赖的服务未运行、单元文件配置错误,或启动顺序/条件不满足。排查需从依赖定义、服务状态、日志和启动流程四方面入手。
查看服务的显式依赖关系
使用 systemctl list-dependencies 可直观查看某个服务声明的依赖项:
-
systemctl list-dependencies --reverse sshd:查哪些服务依赖sshd -
systemctl list-dependencies --all nginx:查nginx所有正向依赖(含间接依赖) - 重点关注
Wants=、Requires=、After=等字段,它们定义了启动前提和顺序
检查被依赖服务的真实状态与日志
依赖声明只是配置,真正起作用的是被依赖服务是否成功激活并保持运行:
本文档主要讲述的是Android架构基本知识;Android依赖Linux内核2.6来提供核心服务,比如进程管理、网络协议栈、硬件驱动。在这里,Linux内核作为硬件层和系统软件栈层之间的一个抽象层。这个操作系统并非类GNU/Linux的,因为其系统库,系统初始化和编程接口都和标准的Linux系统是有所不同的。 Android 包含一些C/C++库、媒体库、数据库引擎库等等,这些库能被Android系统中不同的组件使用,通过 Android 应用程序框架为开发者提供服务。希望本文档会给有需要的朋友带来帮助
- 用
systemctl is-active xxx.service确认状态(返回active才算就绪) - 用
systemctl status xxx.service查看最近启动结果和错误摘要 - 用
journalctl -u xxx.service -n 50 --no-pager翻看详细日志,特别注意Failed to start或Connection refused类提示
验证单元文件中的依赖逻辑是否合理
编辑服务单元文件(如 /etc/systemd/system/myapp.service),重点核对以下内容:
-
Requires=network.target是常见但易误用项——它只表示“需要 network.target 启动完成”,并不保证网络已通;若应用需真实网络连接,应改用After=network-online.target并添加Wants=network-online.target -
BindsTo=比Requires=更严格,一旦被绑定服务退出,本服务会自动停止 - 避免循环依赖:
A Requires=B且B Requires=A会导致 systemd 启动卡死
模拟启动流程,定位阻塞点
用 systemctl analyze plot 生成 SVG 启动时序图(需安装 graphviz),可直观看到各服务启动耗时及依赖链;更轻量的方式是:
- 手动按依赖顺序尝试启动:先
systemctl start xxx.service,再启动目标服务 - 临时禁用部分依赖测试:在单元文件中注释掉
Requires=行后重载并测试(仅用于诊断,勿长期保留) - 启用调试日志:
systemctl set-log-level debug,然后重启服务观察更细粒度输出









