launchd与后台服务
launchd 是 macOS 的服务管理器,负责系统服务、用户代理、定时任务和按需启动。它与 Linux systemd 思路类似,但配置和边界不同。
# 1. 学习目标
- 理解 LaunchDaemon、LaunchAgent 和 plist 配置。
- 能管理后台服务、自启动和定时任务。
- 能排查服务未启动、权限不足和环境变量问题。
# 2. 知识框架
launchd与后台服务
├─ 入门:建立术语、对象和日常操作的直觉
├─ 进阶:理解机制、边界和跨平台差异
└─ 专家:能排障、能设计、能阅读实现和研究材料
LaunchDaemon 偏系统级服务,LaunchAgent 偏用户会话任务;两者运行身份、加载时机和可访问资源不同。
# 3. 核心概念
| 主题 | 说明 | 工程关注 |
|---|---|---|
| LaunchDaemon | 系统级后台任务,通常在用户登录前运行 | 服务进程、权限、日志 |
| LaunchAgent | 用户级后台任务,依赖用户会话 | 菜单栏工具、用户任务 |
| plist | launchd 配置文件格式 | Label、ProgramArguments、RunAtLoad |
| KeepAlive | 控制服务保持运行或按条件重启 | 恢复策略、重启风暴 |
# 4. 机制与实践
- 系统服务放 /Library/LaunchDaemons,用户任务放 ~/Library/LaunchAgents。
- plist 中使用绝对路径,显式配置 WorkingDirectory 和日志输出。
- 修改配置后用 launchctl bootstrap/bootout 重新加载。
# 5. 常用命令与工具
| 命令或工具 | 作用 | 使用建议 |
|---|---|---|
launchctl list | 列出当前 launchd 任务 | 查看加载状态 |
plutil -lint file.plist | 校验 plist 语法 | 修改配置后先检查 |
launchctl print system/label | 查看系统级任务详情 | 排查加载和状态 |
# 6. 常见误区
- 把 Agent 当 Daemon:用户会话依赖和权限不同,放错位置会导致启动失败。
- 依赖 Shell 配置:launchd 不会自动读取交互式 Shell 环境。
- 日志未配置:服务失败时没有标准输出和错误输出,排障困难。
# 7. 进阶研究方向
- 阅读 launchd.plist 的官方字段说明。
- 比较 launchd、systemd、Windows 服务模型差异。
- 设计 macOS 开发机后台任务的统一管理规范。
# 8. Tips 快问快答
Q:LaunchAgent 和 LaunchDaemon 怎么选?
A:需要用户会话的用 Agent,系统级后台服务用 Daemon。
Q:为什么终端能运行,launchd 不能?
A:环境变量、工作目录、用户权限和图形会话不同。
Q:plist 修改后为什么不生效?
A:需要卸载并重新加载任务,且先确认 plist 语法正确。
# 9. 总结
launchd 是 macOS 后台任务的核心入口。理解 Agent、Daemon 和 plist 后,自启动和服务排障会清晰很多。
上次更新: 2026/06/25, 10:02:19