要清晰识别 macos 后台服务真实运行状态,需分三层排查:用户级代理(launchctl list)、系统级守护(sudo launchctl list)、非 launchd 进程(ps -axu);再结合 plist 文件的 disabled 键值判断自启配置。
想在 macos 用命令行看清哪些服务真正在跑、哪些只是“挂着名”,关键不是找一个万能命令,而是分三层查:用户级代理、系统级守护、还有那些压根没走 launchd 的后台进程。下面按实际使用场景拆解。
看当前用户正在运行的后台服务
这类服务随你登录自动启动,能访问桌面(比如微信托盘、飞书更新器、1Password 后台):
- 运行 launchctl list —— 显示所有已加载的用户级服务;第三列是 PID 或 -,出现 - 表示正在运行
- 加过滤更干净:launchctl list | grep -v "0x" | grep -v "PID"
- 查某个具体服务是否活:launchctl print gui/$(id -u)/com.tencent.xinWeChat(把 com.tencent.xinWeChat 换成你要查的服务 ID),输出里 state = running 才算真在跑
查系统级开机即启的守护进程
这些不依赖你登录,一开机就工作(比如打印机服务、Logitech 控制中心、Docker daemon):
- 运行 sudo launchctl list —— 列出 /Library/LaunchDaemons 下已加载的服务(需输管理员密码)
- 快速筛第三方服务:sudo launchctl list | grep -v com.apple.
- /System/Library/LaunchDaemons 中的服务受 SIP 保护,不能改也不能删,也不建议碰
抓那些 launchctl 看不见的“野生”进程
有些程序是直接启动的,没注册进 launchd,所以不会出现在 list 里,但确实在后台占资源:
- 运行 ps -axu —— 列出全部进程,含 PID、用户、CPU 占用、完整命令路径
- 只看典型后台服务(无终端控制台):ps -axu | grep '?' | grep -v grep(TTY 列为 ? 的就是)
- 配合关键词搜索:ps -axu | grep -i alfred 或 ps -axu | grep -i wechat
判断服务是否开机自启,而不是只看它现在跑没跑
launchctl list 显示的是“当前是否加载”,不是“是否设为开机启动”。真正决定自启的是 plist 文件里的配置:
- 系统级服务 plist 存在 /System/Library/LaunchDaemons(SIP 保护)或 /Library/LaunchDaemons
- 用户级服务 plist 通常在 ~/Library/LaunchAgents
- 打开对应 plist 文件,找
Disabled 这一行 —— 如果存在且值为 true,说明被禁用,即使有 RunAtLoad 也不会自启
简单启停和重载服务
别用 start/stop 直接操作,容易失效。标准流程是:
- 停用并卸载:launchctl bootout gui/$(id -u)/com.example.service
- 重新加载配置:launchctl load ~/Library/LaunchAgents/com.example.service.plist(路径必须绝对,不能用 ~)
- 启用开机自启(不影响当前状态):launchctl enable gui/$(id -u)/com.example.service
- 禁用开机自启:launchctl disable gui/$(id -u)/com.example.service
不需要图形界面也能理清后台服务,关键是分清“谁在跑”“谁该跑”“谁被关了”。命令不多,组合起来就清晰。











