PM2报错:app=npm id=0无PID问题排查求助
问题描述
Docker镜像构建成功,通过Azure CLI确认Deployment、Services、Pods创建正常,服务能成功启动并监听8000端口、连接MongoDB,但PM2会突然尝试终止进程失败,出现「PM2 error: app=npm id=0 does not have a pid」错误,最终PM2停止。此前运行正常,近期出现该问题,使用node:14.21.2-alpine镜像、最新版PM2,相关文件及日志如下:
Dockerfile
FROM node:14.21.2-alpine # Set the source folder ARG SOURCE_FOLDER="./" ###################### ENV PYTHONUNBUFFERED=1 RUN apk update && apk add bash RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python RUN python3 -m ensurepip RUN pip3 install --no-cache --upgrade pip setuptools # Create the lscservices.sh for the services start command RUN touch lscservices.sh && \ chmod 700 lscservices.sh && \ echo -e '#!/bin/bash\nlsc services start' > lscservices.sh && \ mv lscservices.sh /usr/bin/ WORKDIR /labshare/communities-api ARG NPM_TOKEN COPY . . # COPY package.json and project . RUN echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > .npmrc RUN apk add --no-cache --virtual .gyp python3 make g++ RUN rm -rf node_modules RUN rm -rf dist RUN npm cache clean --force RUN rm package-lock.json RUN npm install RUN npm i pm2@latest -g RUN npm i bash -g RUN npm -g config set user root RUN npm install @labshare/lsc -g RUN npm install typescript -g RUN npm run build RUN rm -f .npmrc # Run the service using pm2 and the shorcut to lsc start services CMD ["pm2-docker","lscservices.sh"] #CMD ["pm2-runtime", "npm", "start" ] EXPOSE 8000
运行日志
2023-06-22T12:37:53: PM2 log: App [npm:0] exited with code [1] via signal [SIGINT]stdout 2023-06-22T12:37:53: PM2 log: Script /usr/local/bin/npm had too many unstable restarts (16). Stopped. "errored"stdout 2023-06-22T12:37:55: PM2 log: 0 application online, retry = 3 stdout 2023-06-22T12:37:57: PM2 log: 0 application online, retry = 2 stdout 2023-06-22T12:37:59: PM2 log: 0 application online, retry = 1 stdout 2023-06-22T12:38:01: PM2 log: 0 application online, retry = 0 stdout 2023-06-22T16:39:46.559Z info: LabShare services listening at http://:::8000 stdout 2023-06-22T12:38:01: PM2 log: Stopping app:npm id:0 stdout 2023-06-22T12:38:01: PM2 error: app=npm id=0 does not have a pid stderr 2023-06-22T12:38:01: PM2 log: PM2 successfully stopped stdout 2023-06-22T12:39:38: PM2 log: Launching in no daemon mode stdout 2023-06-22T12:39:38: PM2 log: App [lscservices:0] starting in -fork mode- stdout 2023-06-22T12:39:38: PM2 log: App [lscservices:0] online
排查方向与解决方案
1. 解决PM2进程嵌套管理冲突
日志同时出现app=npm id=0和app=lscservices:0,说明存在进程嵌套管理问题:
- 检查
lsc services start内部逻辑,若该命令调用npm start,PM2会间接管理npm进程,导致PID追踪异常。建议直接让PM2管理最终的Node.js进程,比如修改启动命令为pm2-runtime dist/index.js(需确认build后的入口文件路径) - 删除冗余的bash脚本
lscservices.sh,避免中间层导致的进程追踪问题
2. 修复PM2与Node.js版本兼容性
最新版PM2可能不再支持Node.js 14.x,存在兼容性bug:
- 将Dockerfile中的
pm2@latest替换为与Node.js 14兼容的稳定版本,比如pm2@5.3.0,该版本明确支持Node.js 10-18
3. 规范Docker环境下PM2的使用方式
- 替换旧版命令
pm2-docker为官方推荐的pm2-runtime,后者针对容器环境优化了进程管理和信号处理 - 添加PM2配置文件
ecosystem.config.js,明确进程信息,避免自动识别错误:
module.exports = { apps: [{ name: 'communities-api', script: './dist/index.js', // 替换为实际入口文件路径 env: { NODE_ENV: 'production' } }] };
修改Dockerfile的CMD为:CMD ["pm2-runtime", "ecosystem.config.js"]
4. 排查进程退出的根本原因
日志显示App [npm:0] exited with code [1] via signal [SIGINT],说明进程被SIGINT信号终止:
- 在
lscservices.sh中添加set -x开启调试模式,查看脚本执行的详细步骤,定位是否有异常命令触发信号 - 检查Azure/Kubernetes的健康检查配置,确认是否存在探针超时或错误配置导致发送终止信号
- 增加MongoDB连接的详细日志,排查是否存在连接后断开的情况,导致进程异常退出
5. 优化Docker镜像构建
- 删除不必要的依赖安装:
npm i bash -g完全多余,已通过apk add bash安装了bash - 保留
package-lock.json,不要删除,确保依赖安装的一致性,避免因依赖版本变化引入问题 - 使用多阶段构建减少镜像体积,将构建依赖与运行依赖分离,避免不必要的包留在镜像中
内容的提问来源于stack exchange,提问作者shikhar
相关产品推荐
相关产品推荐

