macOS 指南:如何优雅地暂停或停止 launchctl 服务

“在 macOS 中管理服务时,发现 launchctl 没有 pause 命令?本文将教你如何通过 bootout 彻底停止、使用 disable 禁用自启动,甚至利用 Unix 信号 SIGSTOP 原地‘冻结’进程。无论你是想节省系统资源还是进行开发调试,这篇速查指南都能帮你找到最适合的解决方案。”

macOS 指南:如何优雅地暂停或停止 launchctl 服务

在使用 macOS 进行开发或系统管理时,launchctl 是我们绕不开的工具。但你可能发现,它并没有像 service pause 这样直观的“暂停”命令。

本文将教你如何根据不同场景,通过“彻底停止”、“禁用”或“原地冻结”三种方式来管理你的后台服务。


1. 临时停止服务(手动开关)

如果你只是想暂时关闭服务,稍后手动开启,这是最标准的做法。

对于 macOS Big Sur 及后续版本:

# 停止服务
launchctl bootout gui/$(id -u)/com.example.service

# 重新启动服务
launchctl bootstrap gui/$(id -u)/~/Library/LaunchAgents/com.example.service.plist

对于旧版系统:

# 卸载并停止
launchctl unload ~/Library/LaunchAgents/com.example.service.plist

# 加载并启动
launchctl load ~/Library/LaunchAgents/com.example.service.plist


2. 彻底禁用服务(防止重启自动运行)

有时候,你希望即使重启电脑,某个服务也不要自动运行。这时需要将其“禁用”。

# 禁用服务
launchctl disable gui/$(id -u)/com.example.service

# 恢复启用
launchctl enable gui/$(id -u)/com.example.service


3. 极客技巧:原地“冻结”进程

如果你希望服务保持开启状态但停止消耗 CPU(不销毁内存数据),可以利用 Unix 信号。这在调试内存占用较高但不希望重新初始化时非常有用。

  • 暂停执行(挂起): kill -STOP <PID>
  • 恢复执行(继续): kill -CONT <PID>

小贴士: 你可以通过 launchctl list | grep service_name 快速查找到该服务的 PID。


快速对比速查表

需求 命令逻辑 进程状态
短期关闭 bootout / unload 进程被终止
长期禁用 disable 重启不自启
原地暂停 kill -STOP 进程存在但休眠

结语

launchctl 确实比简单的脚本管理要复杂一些,但它提供的精细控制是 macOS 保持稳定的核心。如果你正在处理一个带有 KeepAlive 属性的服务,记得直接用 bootout,否则系统会像打地鼠一样不停地帮你把进程再开起来。