管理macOS自启动守护进程核心是用launchctl操作launchd:分清系统级(/Library/LaunchDaemons/,加system/前缀)与用户级(~/Library/LaunchAgents/,加gui/<UID>/前缀),按加载、启用、启动三步执行,再通过list/print查状态排错,禁用、bootout、unload、rm四步彻底卸载。
管理 macos 自启动守护进程,核心是用 launchctl 操作 launchd 系统,而不是手动启停进程或改脚本权限。关键在于分清服务类型(系统级 vs 用户级)、找准配置文件位置、按规范加载与启用。
区分守护进程与代理:看存放路径和前缀
macOS 用 launchd 统一调度,但两类服务不能混用命令:
-
系统级守护进程(Daemon):需 root 权限,配置文件放在
/Library/LaunchDaemons/,加载时必须加system/前缀,例如:sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.service.plist -
用户级代理(Agent):仅对当前用户生效,配置文件在
~/Library/LaunchAgents/,加载用gui/<UID>/前缀,例如:launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.example.app.plist(501 是当前用户 UID,可用id -u查)
加载、启用、启动三步不可少
只 load 不 enable,服务不会随系统/登录自动运行;只 enable 不 kickstart,可能卡在未触发状态:
- 加载配置:
sudo launchctl load /Library/LaunchDaemons/com.example.service.plist - 启用开机/登录自启:
sudo launchctl enable system/com.example.service - 立即启动(绕过触发条件):
sudo launchctl kickstart -k system/com.example.service
查状态与排错:从输出里找线索
服务没起来,别急着重装 plist,先看它是否注册成功、有没有报错:
- 列出所有已加载服务:
sudo launchctl list | grep example - 打印详细状态(含启用标记、上次退出码):
sudo launchctl print system/com.example.service 2>/dev/null - 若提示 “Could not find service”,检查 plist 中
<key>Label</key>是否与命令中名称完全一致(不含 .plist 后缀,不带空格) - 若提示 “Permission denied”,确认文件属主为
root:wheel、权限为644(系统级)或600(用户级)
停用或卸载:顺序执行才干净
临时停用 ≠ 卸载。要彻底移除自启动行为,建议走完整流程:
- 禁用自动启动:
sudo launchctl disable system/com.example.service - 终止正在运行的实例:
sudo launchctl bootout system/com.example.service - 卸载配置(不再响应任何触发):
sudo launchctl unload /Library/LaunchDaemons/com.example.service.plist - 最后删除 plist 文件:
sudo rm /Library/LaunchDaemons/com.example.service.plist


















