You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:04:58