launchctl 是 macOS 管理 Launch Daemons 和 Launch Agents 的核心命令行工具,用于加载、卸载、启停、查看和调试 plist 服务,支持系统级和用户级服务管理,不依赖图形界面。

launchctl 是 macOS 系统管理后台服务(Launch Daemons 和 Launch Agents)的核心命令行工具,用于加载、卸载、启停、查看和调试 plist 配置的服务。它不依赖图形界面,适合自动化、脚本和故障排查。
加载与卸载服务(启用/禁用开机启动)
服务配置文件(.plist)通常存放在以下位置:
- /Library/LaunchDaemons/ —— 系统级守护进程(需 root 权限,开机即运行)
- ~/Library/LaunchAgents/ —— 用户级代理(登录后自动启动,仅当前用户可见)
- /System/Library/LaunchDaemons/ —— 系统预置服务(不可修改)
加载一个自定义服务(如 homebrew.mxcl.redis.plist):
sudo launchctl load /usr/local/opt/redis/homebrew.mxcl.redis.plist
卸载(停止并取消开机加载):
sudo launchctl unload /usr/local/opt/redis/homebrew.mxcl.redis.plist
⚠️ 注意:macOS Catalina 及之后版本默认启用 SIP,/System 下的 plist 不可随意 load/unload;修改 /Library/LaunchDaemons 必须用 sudo;用户级服务无需 sudo。
启停正在运行的服务
加载 plist 后服务未必立即运行,需手动 start/stop:
sudo launchctl start homebrew.mxcl.redissudo launchctl stop homebrew.mxcl.redis
服务名即 plist 文件中 <key>Label</key> 对应的值(非文件名)。可用 launchctl list 查看已加载服务及其状态码(0 表示正常运行)。
常见状态码含义:
-
0:运行中或已成功退出 -
-1:未运行(可能未启动,或已崩溃退出) -
78:权限不足(如 daemon 尝试以普通用户身份运行)
实时查看与调试服务状态
快速列出所有已加载服务(含 PID、状态、Label):
launchctl list(当前用户)sudo launchctl list(系统级全部)
查看某服务详细信息(如日志路径、启动时间、是否 KeepAlive):
launchctl print gui/$(id -u)/homebrew.mxcl.redis(用户代理)sudo launchctl print system/homebrew.mxcl.redis(系统守护)
若服务启动失败,可临时启用标准输出重定向调试:
- 编辑 plist,在
<dict>内添加:
<key>StandardOutPath</key> <string>/usr/local/var/log/redis.log</string> <key>StandardErrorPath</key> <string>/usr/local/var/log/redis.log</string>
再 reload 并观察日志内容。
开机自启与用户登录启动的区分要点
关键区别不在“能不能开机运行”,而在于运行上下文:
- LaunchDaemon(
/Library/LaunchDaemons):由 root 加载,无用户会话,无法访问 GUI 或用户环境变量(如$HOME、$PATH) - LaunchAgent(
~/Library/LaunchAgents):随用户登录启动,拥有完整 shell 环境,可调用 GUI 应用(如open -a Safari)
常见误操作:把本该是 Agent 的脚本放进 Daemons 目录,导致找不到用户目录或报错 Could not find domain for user。判断依据看 plist 中是否含 LimitLoadToSessionType 或是否依赖 $HOME。

















