macOS 指南:如何优雅地暂停或停止 launchctl 服务
“在 macOS 中管理服务时,发现 launchctl 没有 pause 命令?本文将教你如何通过 bootout 彻底停止、使用 disable 禁用自启动,甚至利用 Unix 信号 SIGSTOP 原地‘冻结’进程。无论你是想节省系统资源还是进行开发调试,这篇速查指南都能帮你找到最适合的解决方案。”
在使用 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,否则系统会像打地鼠一样不停地帮你把进程再开起来。