macos后台服务管理核心是launchd,需通过plist配置与launchctl命令实现开机启动、常驻或按需触发;系统级daemon放/library/launchdaemons/以root运行,用户级agent放~/library/launchagents/仅限当前用户。
macos 的后台服务管理核心是 launchd,它不是传统意义上的“开机启动脚本”,而是一个统一的进程调度与生命周期管理系统。真正要让程序开机运行、常驻后台或按需触发,必须通过正确的 plist 配置 + launchctl 命令组合,而不是简单复制脚本到启动文件夹。
守护进程(Daemon)和代理(Agent)的区别很关键
两者本质不同,不能混用命令或路径:
-
系统级守护进程(Daemon):放在
/Library/LaunchDaemons/,以 root 权限运行,不依赖用户登录,适合网络服务、系统监控等任务;加载时必须用system/前缀,例如sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.service.plist -
用户级代理(Agent):放在
~/Library/LaunchAgents/,只对当前用户生效,可访问图形界面(如弹通知、菜单栏图标),加载用gui/<uid>/</uid>前缀,UID 可用id -u查得
创建一个开机即启的守护进程其实就三步
以 root 身份在系统启动早期运行某脚本为例:
- 写好 plist 文件,存为
/Library/LaunchDaemons/com.myapp.startup.plist,确保含<key>Label</key>(值如com.myapp.startup)、<key>ProgramArguments</key>(数组形式,首项为绝对路径)、<key>RunAtLoad</key><true></true>和<key>KeepAlive</key><true></true> - 设权限:
sudo chown root:wheel /Library/LaunchDaemons/com.myapp.startup.plist,再sudo chmod 644 /Library/LaunchDaemons/com.myapp.startup.plist - 加载并启用:
sudo launchctl bootstrap system /Library/LaunchDaemons/com.myapp.startup.plist,然后sudo launchctl enable system/com.myapp.startup
服务没起来?先查这几点
别急着删重写,多数问题出在细节:
- 用
sudo launchctl list | grep myapp看是否注册成功;若无输出,说明未 load 或 Label 不匹配 - 用
sudo launchctl print system/com.myapp.startup 2>/dev/null查状态,重点看enabled是否为true、pid是否有数值、last exit status是否为 0 - 常见报错:“Could not find service” → 检查 plist 中
Label值是否与命令中完全一致(不含 .plist、无空格);“Permission denied” → 确认属主是 root:wheel、权限是 644(Daemon)或 600(Agent)
停用或彻底卸载服务要按顺序来
临时停止 ≠ 彻底移除。想让服务下次开机也不起,得走完四步:
- 禁用自动启动:
sudo launchctl disable system/com.myapp.startup - 终止当前实例:
sudo launchctl bootout system/com.myapp.startup - 卸载配置:
sudo launchctl unload /Library/LaunchDaemons/com.myapp.startup.plist - 最后再删文件:
sudo rm /Library/LaunchDaemons/com.myapp.startup.plist











