通过Jenkins流水线执行pm2 start启动Python脚本后进程自动停止问题排查
问题原因
- 核心是Jenkins默认开启的进程树清理机制:为了避免构建任务结束后残留孤儿进程占用服务器资源,Jenkins会在单轮构建完成时,向本次构建启动的所有子进程所属进程组发送
SIGTERM信号,批量终止所有相关进程。你在pm2日志中看到的进程收到SIGTERM信号退出,完全符合这个机制的行为特征。 - 你在Jenkins控制台看到的pm2启动成功是构建结束前的瞬时状态,等构建标记为成功后,清理机制触发,pm2和它托管的Python进程就会被统一杀掉,所以登录EC2实例后看不到存活进程。
验证方法
你可以在start_pm2.sh脚本的最后加入sleep 60命令,在构建运行的这60秒内登录EC2,以jenkins用户身份执行pm2 list,可以看到进程处于正常运行状态,等60秒后构建结束,进程就会自动消失,即可确认是该机制导致的问题。
解决方案
在执行pm2启动脚本的步骤,临时禁用Jenkins的进程清理规则即可,只需添加对应的环境变量:
声明式Pipeline写法
stage('部署启动') { environment { BUILD_ID = 'dontKillMe' } steps { sh './start_pm2.sh' } }
脚本式/直接在Shell步骤设置写法
sh 'BUILD_ID=dontKillMe ./start_pm2.sh'
注意:如果你使用的是Jenkins 2.30及以上版本的Pipeline,清理规则对应的环境变量改为
JENKINS_NODE_COOKIE,如果设置BUILD_ID不生效,替换为JENKINS_NODE_COOKIE=dontKillMe即可。
内容的提问来源于stack exchange,提问作者Bgeo25
相关产品推荐
相关产品推荐

