Github Actions中PM2 start命令无法启动进程问题求助
PM2进程在GitHub Actions自托管Runner中启动后SSH无法查看的问题
问题详情
代码推送到master分支后,GitHub Actions Workflow的所有步骤均显示执行正常,但通过SSH登录EC2执行pm2 list却看不到任何进程。对应的Workflow配置如下:
name: Node.js CI on: push: branches: [ "master" ] jobs: build: runs-on: self-hosted strategy: matrix: node-version: [14.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' - run: pwd - run: npm ci - run: npm run build --if-present - run: pm2 kill - run: echo 'pm2 process killed successfully' - run: pm2 start dist/main.js - run: pm2 list
核心原因
- 用户环境隔离:GitHub Actions自托管Runner通常以特定系统用户(如
github-runner)执行任务,而你SSH登录EC2用的是另一个用户(如ec2-user)。PM2是用户级进程管理器,不同用户的PM2进程彼此隔离,跨用户无法查看。 - 非交互式Shell与进程回收:Runner的执行环境是非交互式Shell,任务结束后会清理会话环境变量,PM2默认依赖当前Shell的上下文,当Runner任务完成时,系统会回收关联的PM2进程。
- 缺少持久化配置:Workflow中仅执行
pm2 start,未生成系统级启动配置,即使进程暂时存活,服务器重启或会话结束后也会消失。
解决方案
1. 统一执行用户并添加持久化配置
在Workflow中切换到你SSH登录的用户执行PM2命令,并配置持久化:
# 切换到目标用户(示例为ec2-user),删除旧进程(不存在则忽略) sudo -u ec2-user pm2 delete your-app-name || true # 启动进程并指定名称 sudo -u ec2-user pm2 start dist/main.js --name "your-app-name" # 保存当前PM2进程列表为持久化配置 sudo -u ec2-user pm2 save # 生成系统服务配置,确保重启后自动恢复进程 sudo -u ec2-user pm2 startup
2. 加载完整用户环境启动PM2
非交互式Shell缺少用户常规环境变量,通过bash -l加载用户的.bashrc/.profile配置后再启动:
sudo -u ec2-user bash -l -c "pm2 start dist/main.js --name 'your-app-name'"
3. 验证Runner执行用户
在Workflow中添加步骤查看Runner的运行用户,确认是否和SSH用户一致:
run: whoami
如果输出用户与SSH用户不同,必须使用sudo -u 目标用户前缀执行所有PM2命令。
4. 优化进程管理逻辑
避免使用pm2 kill一次性终止所有进程,改为针对特定应用操作,减少对其他可能存在的PM2进程的影响:
# 仅删除目标应用进程 sudo -u ec2-user pm2 delete your-app-name || true # 重新启动目标应用 sudo -u ec2-user pm2 start dist/main.js --name your-app-name
内容的提问来源于stack exchange,提问作者pravin dabhi
相关产品推荐
相关产品推荐

