我正在 AWS EC2 服务器上运行我的节点应用程序。 为了持续集成,我在 EC2 上安装了 Jenkins,jenkins 连续轮询代码提交,并在提交发生时执行脚本中编写的一些命令。
最后一个命令是
pm2启动server.js
一切正常,构建显示成功,但稍后当我访问 URL 时,该网站不显示。
我在节点服务器前面有一个 nginx 服务器,它给出了 502 网关错误
检查后我意识到节点应用程序没有运行,所以我检查了 pm2 日志并发现这种情况发生 -
2016-08-12 07:53:28: [[[[ PM2/God 守护进程启动 ]]]]
2016-08-12 07:53:28:端口 /var/lib/jenkins/.pm2/pub.sock 上的总线系统 [READY]
2016-08-12 07:53:28:端口 /var/lib/jenkins/.pm2/rpc.sock 上的 RPC 接口 [READY]
2016-08-12 07:53:28:以-fork模式-启动执行序列,应用程序名称:服务器id:0
2016-08-12 07:53:28: 应用名称:服务器id:0 在线
2016-08-12 07:53:28: pm2 已被信号杀死,退出前转储进程列表...
2016-08-12 07:53:28: 删除进程0
2016-08-12 07:53:28:停止应用程序:服务器 ID:0
2016-08-12 07:53:28:具有 id [0] 和 pid [25822] 的应用程序 [服务器],通过信号 [SIGTERM] 以代码 [0] 退出
2016-08-12 07:53:28:Proc 不再定义或正在被杀死
2016-08-12 07:53:28: [PM2] 平静退出
pm2 一启动就被杀死了,不知道为什么,尝试从 npm 重新安装 pm2 不起作用。
Ubuntu 14.04 LTS
节点 v4.4.7 LTS
npm v2.15.8
pm2 v1.1.3
工作暂停,请立即寻求帮助。
答案在 Dusan Bajic 给出的评论中,如果有人使用节点应用程序在 EC2 上与 jenkins 进行持续集成,并且 pm2 发生类似的事情,只需在启动 pm2 之前在脚本中添加此行即可。
导出 BUILD_ID=dontKillMePlease
而不是
pm2启动server.js
使用
pm2重启server.js
server.js 是您的应用程序,否则如果在 jenkins 中提交并且它再次运行脚本,构建将会失败,因为 pm2 已经在运行 server.js 并且不会停止。
为了可靠地终止构建期间由作业生成的进程,Jenkins 包含一些本机代码来列出此类进程并杀死它们
...
如何运作
ProcessTreeKiller 利用了以下事实: 默认情况下,新进程会获取其环境变量的副本 产卵/创建过程。
它在执行进程中设置特定的环境变量 建立工作。稍后,当用户请求停止构建作业时 process 它获取计算机上运行的所有进程的列表,并且 他们的环境变量,并查找环境变量 它最初是为构建作业的过程设置的。
然后,在其环境中具有该环境变量的每个作业 终止。
如果您的构建想要让守护进程留在后面运行...
实现此目的的一个便捷方法是更改环境变量 Jenkins 的 ProcessTreeKiller 正在寻找的 BUILD_ID。这会 导致 Jenkins 假设您的守护进程不是由 Jenkins 生成的 建造。例如:
BUILD_ID=dontKillMe /usr/apache/bin/httpd
在较新版本的 Jenkins 中,BUILD_ID 已弃用。而是使用 JENKINS_NODE_COOKIE=dontKillMe
在我的 Jenkinsfiles 中,我像下面这样使用它
stage('Run') {
steps {
script {
sh 'export JENKINS_NODE_COOKIE=dontKillMe; pm2 --name SampleApp start npm -- start'
}
}
}
如果您调用 shell 脚本,请在 shell 脚本文件中添加 JENKINS_NODE_COOKIE=dontKillMe。