【问题标题】:Python script not starting from Jenkins pipeline via pm2 start commandPython 脚本未通过 pm2 start 命令从 Jenkins 管道启动
【发布时间】:2021-11-17 04:42:16
【问题描述】:

我正在尝试设置我的 Jenkins 管道以在部署步骤期间运行 pm2 start 命令。 pm2 start 命令位于 Bash 脚本中,并使用 pm2 运行我的 Python 程序。每次我手动运行构建时,Jenkins 控制台都会报告构建成功,并且控制台输出显示 pm2 已启动 Python 程序并为其分配了一个 PID。

这是 Jenkins 构建控制台输出的最后几行:

+ ./start_pm2.sh
[PM2] Starting /var/lib/jenkins/workspace/rocket-league-tourney-bot/rocket_league_tourney_bot.py in fork_mode (1 instance)
[PM2] Done.
┌─────┬──────────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name                         │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼──────────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ rocket_league_tourney_bot    │ default     │ N/A     │ fork    │ 28304    │ 0s     │ 0    │ online    │ 0%       │ 6.3mb    │ jenkins  │ disabled │
└─────┴──────────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

但是,如果我登录到远程机器(AWS EC2 实例),我看到 pm2 分配的 PID 不存在并且程序没有运行。

我检查了 PID 并以 jenkins 用户的身份运行 pm2 list,我发现它已经停止:

[root@ip-xxx-xx-xx-xxx logs]# ps -s 28304
  PID TTY          TIME CMD
[root@ip-xxx-xx-xx-xxx logs]# runuser -u jenkins pm2 list
┌─────┬──────────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name                         │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼──────────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ rocket_league_tourney_bot    │ default     │ N/A     │ fork    │ 0        │ 0      │ 0    │ stopped   │ 0%       │ 0b       │ jenkins  │ disabled │
└─────┴──────────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

pm2 日志也无济于事:

[root@ip-xxx-xx-xx-xxx logs]# runuser -u jenkins pm2 log
[TAILING] Tailing last 15 lines for [all] processes (change the value with --lines option)
/var/lib/jenkins/.pm2/pm2.log last 15 lines:
PM2        | 2021-09-23T18:42:47: PM2 log: App [rocket_league_tourney_bot:0] online
PM2        | 2021-09-23T18:44:28: PM2 log: Stopping app:rocket_league_tourney_bot id:0
PM2        | 2021-09-23T18:44:28: PM2 log: App [rocket_league_tourney_bot:0] exited with code [0] via signal [SIGINT]
PM2        | 2021-09-23T18:44:28: PM2 log: pid=27651 msg=process killed
PM2        | 2021-09-23T18:47:47: PM2 log: App [rocket_league_tourney_bot:0] starting in -fork mode-
PM2        | 2021-09-23T18:47:47: PM2 log: App [rocket_league_tourney_bot:0] online
PM2        | 2021-09-23T18:48:03: PM2 log: Stopping app:rocket_league_tourney_bot id:0
PM2        | 2021-09-23T18:48:03: PM2 log: App [rocket_league_tourney_bot:0] exited with code [0] via signal [SIGINT]
PM2        | 2021-09-23T18:48:03: PM2 log: pid=27739 msg=process killed
PM2        | 2021-09-23T18:50:37: PM2 log: App [rocket_league_tourney_bot:0] starting in -fork mode-
PM2        | 2021-09-23T18:50:37: PM2 log: App [rocket_league_tourney_bot:0] online
PM2        | 2021-09-23T18:50:37: PM2 log: App [rocket_league_tourney_bot:0] exited with code [0] via signal [SIGTERM]
PM2        | 2021-09-23T19:00:31: PM2 log: App [rocket_league_tourney_bot:0] starting in -fork mode-
PM2        | 2021-09-23T19:00:31: PM2 log: App [rocket_league_tourney_bot:0] online
PM2        | 2021-09-23T19:00:31: PM2 log: App [rocket_league_tourney_bot:0] exited with code [0] via signal [SIGTERM]

/var/lib/jenkins/.pm2/logs/rocket-league-tourney-bot-out.log last 15 lines:
/var/lib/jenkins/.pm2/logs/rocket-league-tourney-bot-error.log last 15 lines:

输出和错误日志文件都是空的。

我验证了环境变量和 Python/Pip 在 jenkins 用户的范围内。会发生什么?谢谢。

【问题讨论】:

  • 听起来好像在构建完成后,Jenkins 正在杀死它开始的一切。 (自行清理。)请参阅此问题/答案:serverfault.com/questions/502593/…
  • 我在 Jenkins 构建步骤中设置了 BUILD_ID=dontKillMeJENKINS_NODE_COOKIE=dontKillMe python3,但它仍然无法正常工作。这应该在 pm2 开始之前还是之后?
  • 我会尝试export BUILD_ID=dontKillMe 然后export JENKINS_NODE_COOKIE=dontKillMe 然后./start_pm2.sh & 每个命令都在单独的行上。
  • 这是我的部署步骤,进行了这些更改,但仍然无法正常工作.. ` stage('Deploy') { steps { echo 'Deploying....' sh "export BUILD_ID=dontKillMe" sh "export JENKINS_NODE_COOKIE=dontKillMe" sh "chmod +x ./start_pm2.sh" sh "chmod +x ./stop_pm2.sh" sh "./stop_pm2.sh || true" sh "./start_pm2.sh" } } `

标签: python jenkins jenkins-pipeline pm2


【解决方案1】:

可能是 Jenkins 启动了一个运行 ./start_pm2.sh 的 shell 实例 (bash),而后者又在“fork 模式”下运行 pm2pm2 的父级是您的 bash 实例。

脚本完成后,bash 进程被杀死,它的任何子进程也被杀死,包括您的 pm2 进程。

如果是这种情况,为了防止这种情况发生,要么在非分叉模式下启动 pm2 并等待它完成,要么修改你的脚本以启动一个没有bash 作为其父级。

您可能需要阅读 nohupdaemonize 作为实现该目标的可能解决方案。

【讨论】:

  • 不确定我是否检查正确,但是根据ps -fpm2的父进程的PID为1,即systemd
猜你喜欢
  • 2019-05-30
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2020-12-21
  • 2019-07-17
  • 1970-01-01
相关资源
最近更新 更多