macos 服务由 launchd 统一管理,通过 .plist 文件配置,分系统级、管理员级和用户级三类路径;使用 launchctl list/load/unload/enable/disable 等命令启停与管理服务,并可通过 log show 和 launchctl print 调试状态。

macOS 终端本身不直接提供类似 Linux 的 systemctl 或 service 命令来统一管理“系统服务”,但其底层依赖 launchd —— 这是 macOS 原生的、统一的进程和服务管理器。所有系统级和用户级服务(如 Apache、PostgreSQL、定时任务、后台守护进程)都通过 launchd 启动、停止和配置。掌握它,才是真正掌控 macOS 服务的关键。
识别服务:先知道哪些服务在运行
系统服务以 .plist 文件形式存在,分为三类位置:
-
系统级:
/System/Library/LaunchDaemons/(苹果预装,普通用户不可修改) -
第三方/管理员级:
/Library/LaunchDaemons/(需sudo权限启用) -
用户级:
~/Library/LaunchAgents/(随当前用户登录自动加载,无需密码)
查看已加载的服务列表:
- 查所有已加载的用户级服务:
launchctl list | grep -v "0x" - 查所有已加载的系统级服务(需权限):
sudo launchctl list - 快速筛选某个服务是否存在(如
httpd):launchctl list | grep httpd
启停服务:用 launchctl 控制运行状态
操作前请确认 plist 文件名(不含扩展名),例如 homebrew.mxcl.redis 或 org.apache.httpd。
- 启动一个用户级服务:
launchctl load ~/Library/LaunchAgents/com.example.myapp.plist - 停止并卸载该服务:
launchctl unload ~/Library/LaunchAgents/com.example.myapp.plist - 启用开机/登录时自动启动(仅对 LaunchAgents 有效):
launchctl enable gui/$(id -u)/com.example.myapp - 禁用自动启动:
launchctl disable gui/$(id -u)/com.example.myapp - 重启服务(先 unload 再 load):
launchctl unload ... && launchctl load ...
⚠️ 注意:load/unload 是即时生效的操作;enable/disable 管理的是“是否随登录自动触发”,两者作用不同,别混淆。
调试服务:看日志与检查状态
服务出问题时,不能只看终端回显——要查它的实际输出和错误。
- 查看某服务最近的标准输出与错误(适用于刚启动失败的服务):
launchctl log level debug(临时开启全局调试),然后重试操作 - 更常用且安全的方式:查看系统日志中该服务相关记录:
log show --predicate 'subsystem == "com.example.myapp"' --last 1h - 检查服务当前是否正在运行(PID 是否存在):
launchctl print gui/$(id -u)/com.example.myapp 2>/dev/null | grep -q "state = running" && echo "running" || echo "not running" - 手动触发一次服务(绕过自动条件):
launchctl kickstart gui/$(id -u)/com.example.myapp
自定义服务:写一个最简 .plist 示例
想让脚本或程序随系统启动?只需一个 .plist 文件。以下是最小可用模板(保存为 ~/Library/LaunchAgents/local.hello.plist):
<?xml version="1.0" encoding="UTF-8"?><plist version="1.0"><dict><key>Label</key><string>local.hello</string><key>ProgramArguments</key><array><string>/bin/echo</string><string>Hello from launchd!</string></array><key>RunAtLoad</key><true></true></dict></plist>
保存后执行:launchctl load ~/Library/LaunchAgents/local.hello.plist,它就会立即运行一次。若想让它持续运行或响应事件,还需添加 KeepAlive、StartInterval 或 WatchPaths 等键。











