PM2 管理 OpenClaw
PM2 管理 OpenClaw:让服务稳如磐石,告别“临时工”心态
服务保活是个技术活,核心目标就一个:别让你的关键服务像个“临时工”一样,说跑路就跑路。今天要聊的,就是如何用 PM2 这个专业工具,把 OpenClaw 服务管得服服帖帖。
为了讲清楚,这份指南分成了两大块:
第一部分,是可长期复用的 PM2 标准操作流程,手把手教你搭建稳健的运行环境。
第二部分,则是一次真实的故障复盘记录,看看踩了哪些坑,以及如何精准排雷。
先说核心结论:用 PM2 管理 OpenClaw,关键就三件事。第一,必须通过生态配置文件 ecosystem.config.js 来启动命令行工具。第二,务必配置日志切割,这是防止日志文件无限膨胀、最终撑爆磁盘的保命操作。第三,也是最重要的一点,只保留 PM2 这一种管控方式,千万别让它和系统自带的服务管理并存,否则冲突起来会让你头疼不已。
为什么是 PM2?它的核心价值在哪
PM2 是什么?简单说,它是 Node.js 应用的进程管理专家,你可以把它想象成 Node.js 进程的“全能管家”。这个管家能干的事可多了:应用的启动、停止、重启不在话下,还能集中管理日志、实时监控状态。更厉害的是,它能实现进程崩溃后自动拉起、内存超限自动重启,甚至配置系统开机自启。有了它,服务的稳定性自然就上了一个台阶。
| 核心能力 | 具体作用 | 对 OpenClaw 的现实意义 |
|---|---|---|
| 进程守护 | 进程崩溃后自动重新拉起 | 最大限度避免服务意外中断,保障连续性 |
| 内存阈值重启 | 内存占用超过设定值(如 max_memory_restart)时自动重启 | 有效降低因内存泄漏或长期运行导致的卡死风险 |
| 日志集中与切割 | 收集日志并限制单个文件大小,自动分片存档 | 防止日志文件无限增长,最终占满整个磁盘空间 |
| 开机自启 | 系统重启后,自动恢复预设的进程列表 | 减少人工干预,实现真正的“设好即忘”式运维 |
一步步来:配置详解(以 macOS 为例)
理论讲完,咱们动手实操。下面就以 macOS 系统为例,看看具体怎么配置。
1. 安装 PM2
首先,通过 npm 全局安装 PM2,并验证版本。
npm install -g pm2
pm2 -v
2. 准备专属目录
创建一个专门的目录来存放配置和日志,让一切井然有序。
mkdir -p ~/.openclaw/logs
3. 创建核心配置文件
在 ~/.openclaw/ 目录下,创建名为 ecosystem.config.js 的文件。这才是 PM2 管理 OpenClaw 的“总指挥所”。
module.exports = {
apps: [{
name: 'openclaw',
script: '/Users/yourname/.nvm/versions/node/v22.22.1/bin/openclaw',
args: 'gateway --port 18789',
interpreter: 'none',
max_memory_restart: '1G',
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
merge_logs: true,
max_size: '100M',
log_file: '/Users/yourname/.openclaw/logs/combined.log',
out_file: '/Users/yourname/.openclaw/logs/out.log',
error_file: '/Users/yourname/.openclaw/logs/error.log',
env: {
NODE_ENV: 'production'
}
}]
};
配置里有几个关键点需要特别注意:
script 字段必须填入通过 which openclaw 命令查到的绝对路径,不能用相对路径。对于管理 CLI 工具,interpreter: 'none' 这个设置至关重要,千万别省略。另外,max_size 参数强烈建议配置,它就是前面提到的“日志切割”开关,能牢牢锁住日志文件的体积。
必须掌握的标准操作命令
配置好之后,日常管理就靠下面这些命令了。熟记它们,运维效率能提升一大截。
# 启动服务
cd ~/.openclaw && pm2 start ecosystem.config.js
# 停止服务(会保留进程配置记录)
pm2 stop openclaw
# 重启服务(修改配置后通常需要执行此操作)
pm2 restart openclaw
# 从PM2列表中彻底删除进程记录(需要重建时使用)
pm2 delete openclaw
# 查看所有由PM2管理的进程状态
pm2 list
# 实时追踪服务日志输出
pm2 logs openclaw -f
进阶一步:配置开机自启(macOS)
想让服务在电脑重启后自动恢复?PM2 也能轻松搞定。
pm2 startup darwin
pm2 save
这里有两个常见的注意事项:首先,pm2 startup systemd 是 Linux 系统的命令,在 macOS 上可别用错了,得用 darwin。其次,执行完 pm2 startup darwin 后,命令行通常会提示一条需要 sudo 权限执行的命令,记得跟着执行一下。最后,pm2 save 的作用是保存当前 PM2 管理的进程清单,它不能替代 startup 步骤,两步都需要完成。
实战复盘:一次端口占用报错的全过程
光说不练假把式。下面分享一次真实的故障处理经历,看看理论如何指导实践。
当时发生了什么?
执行启动命令时,终端接连报出几条错误信息:
Port 18789 is already in use (端口已被占用)
gateway already running (pid 35631) (网关进程已存在)
Gateway service appears loaded (网关服务似乎已加载)
很明显,启动失败了。
问题根源在哪里?
直接原因很清晰:18789 这个端口已经被一个正在运行的网关进程占用了,再次执行启动命令,自然就会冲突。
但更深层的原因是什么呢?其实是管理方式的“政出多门”。PM2 想管这个进程,而 macOS 的系统服务(LaunchAgent)也在试图管理它,两套管理系统并存,很可能导致同一个进程被重复拉起,或者状态管理混乱。
这里有一个关键洞察:像飞书这类依赖端连接的应用,它们检测服务是否可用的标准,是“能否成功连接到指定的端口”,而不是“启动命令是否成功执行”。也就是说,只要已经有网关进程在 18789 端口上正常监听,飞书就可能一直正常工作,即便你再次执行启动命令会报错。
一步步解决它
遇到问题不要慌,按照以下步骤排查,基本都能解决。
# 1) 强制停止占用端口的旧进程
kill -9 35631
# 2) 卸载可能自动拉起服务的系统启动项
launchctl bootout gui/501/ai.openclaw.gateway
# 3) 清理 PM2 中旧的进程记录,避免干扰
pm2 stop openclaw
pm2 delete openclaw
# 4) 确认端口已被释放(执行后无输出则表示端口空闲)
lsof -i :18789
# 5) 使用唯一的、正确的入口重新启动
cd ~/.openclaw && pm2 start ecosystem.config.js
处理完成后,执行 pm2 list 检查,openclaw 的状态应该已经恢复为 online。自此之后,坚持只通过 PM2 这个单一入口来管理服务,就再也没出现过重复启动的冲突了。
这次复盘给我们提了个醒:第一,管控方式务必统一,强烈推荐只用 PM2。第二,在启动或重启服务前,养成先检查端口占用情况的好习惯。第三,报错信息本身有时会“骗人”,它不代表服务一定不可用,首先得判断当前是否已有进程在运行。
常用命令速查表
最后,送上一张速查表,把最常用的命令汇总在一起,方便随时取用。
| 需求场景 | 对应命令 |
|---|---|
| 启动服务 | cd ~/.openclaw && pm2 start ecosystem.config.js |
| 停止服务 | pm2 stop openclaw |
| 重启服务 | pm2 restart openclaw |
| 删除记录 | pm2 delete openclaw |
| 查看状态 | pm2 list |
| 查看日志 | pm2 logs openclaw -f |