Mac 本地服务常驻运行配置总结(pm2 + caffeinate)
目标
- 本地 Go / Python 服务长期运行
- 关闭终端不影响服务
- 避免系统休眠导致服务中断
- 服务可统一管理、自动重启、可查看日志
一、核心工具
| 工具 | 用途 |
|---|---|
| pm2 | 后台进程管理、自动重启、多服务托管 |
| caffeinate | 防止 macOS 睡眠 |
| Go build | 编译 Go 二进制,提高稳定性 |
| ezpm2gui | 可视化管理PM2 |
二、Go 服务:从 go run 升级为「构建后运行」
1. 构建二进制
mkdir -p bin
go build -o bin/server cmd/server/*.go
2. 直接运行测试
./bin/server
3. 优势
- 启动更快
- 避免运行时编译失败
- 更适合 pm2 守护
- 更接近生产部署模式
三、使用 pm2 管理多个服务(Go + Python)
1. 安装 pm2
npm install -g pm2
2. 创建 ecosystem 配置
pm2 ecosystem
3. 示例 ecosystem.config.js
module.exports = {
apps: [
{
name: "python-api",
script: "./scripts/start.sh",
autorestart: true,
restart_delay: 3000
},
{
name: "go-server",
script: "./bin/server",
autorestart: true,
restart_delay: 3000
}
]
}
4. 启动服务
pm2 start ecosystem.config.js
5. 常用管理命令
pm2 list # 查看状态
pm2 logs # 查看日志
pm2 restart all # 重启全部服务
pm2 stop all # 停止全部服务
pm2 delete all # 删除全部服务
pm2 kill # 停止 pm2 守护进程
四、Go 服务更新流程(推荐)
go build -o bin/server cmd/server/*.go
pm2 restart go-server
或:
pm2 restart all
五、防止 Mac 睡眠(避免服务断线)
1. 手动启用防睡眠
caffeinate -dimsu
2. 推荐:将 caffeinate 纳入 pm2 管理
{
name: "keep-awake",
script: "caffeinate",
args: "-dimsu",
autorestart: true
}
这样可统一控制:
pm2 stop keep-awake
pm2 restart keep-awake
六、开机自启(可选)
pm2 startup
pm2 save
重启系统后自动恢复服务。
七、终端 / 休眠行为总结
| 操作 | 服务状态 |
|---|---|
| 关闭终端 | ✅ 不受影响 |
| 锁屏 | ✅ 不受影响 |
| 合盖(默认) | ❌ 系统休眠 → 服务暂停 |
| caffeinate 启用 | ✅ 合盖仍保持运行 |
| 系统重启 + pm2 startup | ✅ 自动恢复 |
八、可视化管理PM2
安装 ezpm2gui, 在 ecosystem.config.js 中加入一段:
{
name: "ezpm2gui",
script: "ezpm2gui",
env: {
HOST: "127.0.0.1",
PORT: xxxx
},
autorestart: true,
watch: false,
max_memory_restart: "150M"
}
然后可以在浏览器里管理 pm2 下的进程了。
九、推荐实践
- 开发期:pm2 + 手动 build + restart
- 长期运行:pm2 + caffeinate
- 多服务统一托管:ecosystem.config.js
- 避免 nohup / 孤儿进程,统一交给 pm2 管理
十、最终效果
- 本地服务长期稳定运行
- 终端关闭无影响
- 自动重启防崩溃
- 防止休眠导致断服
- 一条命令可控所有服务