📋 进程清单与状态 >>>
先看列表、再看详情、最后再操作,是最稳妥的日常顺序。
pm2 list:查看全部进程pm2 status list:别名pm2 jlist:以 JSON 输出列表pm2 prettylist:结构化查看进程信息pm2 describe <app>:查看某个进程完整详情pm2 monit:打开实时监控面板
# 先确认进程名、ID、模式与状态
pm2 list
pm2 describe api
pm2 monit
🚀 启动与命名 >>>
用脚本、解释器参数、环境变量和名称来规范启动行为。
pm2 start app.js --name api:启动并命名pm2 start server.js --watch:监听文件变动自动重启pm2 start worker.js --time:日志带时间戳pm2 start ./dist/main.js --max-memory-restart 512M:超内存自动重启pm2 start ./script.sh --interpreter bash:指定解释器pm2 start app.js -- --port 3000:向应用透传参数
# 生产环境常见启动方式
pm2 start ./dist/server.js \
--name api \
--env production \
--time \
--max-memory-restart 512M
🔄 生命周期操作 >>>
restart、reload、stop、delete 是最常用的四件套。
pm2 restart <app>:重启目标进程pm2 reload <app>:零停机重载,适合集群模式pm2 stop <app>:停止但保留定义pm2 delete <app>:删除进程定义pm2 restart all:重启全部进程pm2 delete all:删除全部进程pm2 reset <app>:重置重启次数等元信息
# 发布后无中断重载
pm2 reload api
pm2 describe api
🪵 日志管理 >>>
PM2 默认拆分 out / err 日志,追问题时优先定向看单个进程。
pm2 logs:查看全部实时日志pm2 logs api --lines 200:查看指定进程最近 200 行pm2 logs --err:只看错误日志pm2 flush:清空日志pm2 reloadLogs:重载日志文件句柄pm2 install pm2-logrotate:安装日志轮转模块
# 只盯住一个服务的错误
pm2 logs api --err --lines 100
🧬 集群与扩缩容 >>>
CPU 密集或无状态 Web 服务优先考虑 cluster,并用 reload 做平滑更新。
pm2 start app.js -i max:以 CPU 核数启动集群pm2 start app.js -i 4:指定实例数pm2 scale api 6:扩容或缩容到指定实例数pm2 reload api:集群模式零停机重载pm2 show api:查看实例分布和模式
module.exports = {
apps: [
{
name: "api",
script: "./dist/server.js",
instances: "max",
exec_mode: "cluster",
max_memory_restart: "512M"
}
]
};
🧩 Ecosystem 配置 >>>
复杂项目不要堆命令行参数,统一落到 ecosystem 文件里。
pm2 start ecosystem.config.js:按配置文件启动pm2 restart ecosystem.config.js --only api:只重启指定 apppm2 reload ecosystem.config.js --only api:只热重载指定 apppm2 delete ecosystem.config.js:删除该配置下的进程
module.exports = {
apps: [
{
name: "api",
script: "./dist/server.js",
cwd: "/srv/myapp",
instances: 2,
exec_mode: "cluster",
env: {
NODE_ENV: "development",
PORT: 3000
},
env_production: {
NODE_ENV: "production",
PORT: 8080
}
}
]
};
🌍 环境变量与发布环境 >>>
把环境差异收敛到 ecosystem 的 `env` / `env_production`,不要散落在命令里。
--env production env_production:选用env:默认环境变量env_staging:自定义环境组appendEnvToName:把环境名追加到进程名
module.exports = {
apps: [
{
name: "api",
script: "./dist/server.js",
appendEnvToName: true,
env: {
NODE_ENV: "development"
},
env_production: {
NODE_ENV: "production"
}
}
]
};
👀 Watch 与自动重启 >>>
watch 很适合开发环境,生产环境要控制监听范围,避免频繁抖动。
pm2 start app.js --watch:监听文件变化--ignore-watch="node_modules logs":忽略目录watch_delay:避免频繁连续重启restart_delay:重启之间增加延迟max_restarts:限制重启次数
module.exports = {
apps: [
{
name: "api-dev",
script: "./src/server.js",
watch: ["src"],
ignore_watch: ["node_modules", "logs"],
watch_delay: 500
}
]
};
开机自启动与持久化
pm2 startup:生成自启动命令pm2 save:保存当前进程清单pm2 resurrect:从保存的清单恢复pm2 unstartup:移除自启动
# 常见上线顺序
pm2 startup
pm2 save
pm2 resurrect
🤝 优雅启动与停止 >>>
最新官方文档把 graceful reload、wait-ready、kill-timeout 和 Windows 消息退出收敛到同一组能力。
pm2 reload api:对支持优雅退出的服务做平滑重载pm2 start app.js --wait-ready:等待应用显式发送 readypm2 start app.js --listen-timeout 8000:放宽启动等待pm2 start app.js --kill-timeout 3000:放宽停止等待pm2 start app.js --shutdown-with-message:Windows 下用消息而不是 Unix 信号
process.on("SIGINT", async () => {
await server.close();
process.exit(0);
});
process.send?.("ready");
🐳 Docker 与 pm2-runtime >>>
在容器里优先使用 `pm2-runtime`,它更符合单进程容器语义。
pm2-runtime ecosystem.config.js --env production:在容器中以前台方式运行pm2-runtime start app.js -i max:容器内启动 clusterkill_timeout:容器停止时留给应用清理的时间
FROM node:22-alpine
WORKDIR /app
COPY . .
RUN corepack enable && pnpm install --prod
CMD ["pm2-runtime", "ecosystem.config.js", "--env", "production"]
🩺 监控与诊断 >>>
出现重启风暴、内存飙升、请求抖动时,先看 describe 和 monit。
pm2 show <app>:查看 CPU、内存、重启次数pm2 env <id>:查看某个进程的环境变量pm2 ping:检查 PM2 daemon 是否可用pm2 report:生成诊断报告pm2 trigger <app> <action>:调用自定义 action
# 排查某个实例频繁重启
pm2 show api
pm2 logs api --err --lines 200
pm2 env 0
🧯 常见排障 >>>
先确认脚本路径、cwd、环境变量,再看日志与重启策略。
cwdwait_readyignore_watchpm2 start ... --no-daemon pm2-runtime