使用 jenkins 的 EC2 上的 pm2 运行 不工作?
pm2 running on EC2 using jenkins not working?
我是 运行 我在 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:总线系统 [READY] 在端口 /var/lib/jenkins/.pm2/pub.sock
2016-08-12 07:53:28:端口 /var/lib/jenkins/.pm2/rpc.sock[=11 上的 RPC 接口 [READY] =]
2016-08-12 07:53:28:在应用程序的 -fork 模式下启动执行序列 name:server id:0
2016-08-1207:53:28:应用name:serverid:0在线
2016-08-12 07:53:28: pm2已被信号杀死,退出前转储进程列表...
2016-08-12 07:53:28: 删除进程 0
2016-08-12 07:53:28:停止 app:server id:0
2016-08-12 07:53:28:ID 为 [0] 和 pid [25822] 的应用程序 [服务器],通过信号 [SIGTERM][=70 以代码 [0] 退出=]
2016-08-12 07:53:28: Proc 不再定义或正在被杀死
2016-08-12 07:53:28: [PM2] 和平退出
pm2 一启动就被杀死,不知道为什么,尝试从 npm 重新安装 pm2 没有用。
Ubuntu 14.04 LTS
Node 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 并且不会停止。
To reliably kill processes spawned by a job during a build, Jenkins
contains a bit of native code to list up such processes and kill them
...
How it works
The ProcessTreeKiller takes advantage of the fact that by
default a new process gets a copy of the environment variables of its
spawning/creating process.
It sets a specific environment variable in the process executing the
build job. Later, when the user requests to stop the build job's
process it gets a list of all processes running on the computer and
their environment variables, and looks for the environment variable
that it initially set for the build job's process.
Every job with that environment variable in its environment is then
terminated.
If your build wants to leave a daemon running behind...
A convenient way to achieve that is to change the environment variable
BUILD_ID which Jenkins's ProcessTreeKiller is looking for. This will
cause Jenkins to assume that your daemon is not spawned by the Jenkins
build. For example:
BUILD_ID=dontKillMe /usr/apache/bin/httpd
我是 运行 我在 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:总线系统 [READY] 在端口 /var/lib/jenkins/.pm2/pub.sock
2016-08-12 07:53:28:端口 /var/lib/jenkins/.pm2/rpc.sock[=11 上的 RPC 接口 [READY] =]
2016-08-12 07:53:28:在应用程序的 -fork 模式下启动执行序列 name:server id:0
2016-08-1207:53:28:应用name:serverid:0在线
2016-08-12 07:53:28: pm2已被信号杀死,退出前转储进程列表...
2016-08-12 07:53:28: 删除进程 0
2016-08-12 07:53:28:停止 app:server id:0
2016-08-12 07:53:28:ID 为 [0] 和 pid [25822] 的应用程序 [服务器],通过信号 [SIGTERM][=70 以代码 [0] 退出=]
2016-08-12 07:53:28: Proc 不再定义或正在被杀死
2016-08-12 07:53:28: [PM2] 和平退出
pm2 一启动就被杀死,不知道为什么,尝试从 npm 重新安装 pm2 没有用。
Ubuntu 14.04 LTS
Node 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 并且不会停止。
To reliably kill processes spawned by a job during a build, Jenkins contains a bit of native code to list up such processes and kill them
...
How it works
The ProcessTreeKiller takes advantage of the fact that by default a new process gets a copy of the environment variables of its spawning/creating process.
It sets a specific environment variable in the process executing the build job. Later, when the user requests to stop the build job's process it gets a list of all processes running on the computer and their environment variables, and looks for the environment variable that it initially set for the build job's process.
Every job with that environment variable in its environment is then terminated.
If your build wants to leave a daemon running behind...
A convenient way to achieve that is to change the environment variable BUILD_ID which Jenkins's ProcessTreeKiller is looking for. This will cause Jenkins to assume that your daemon is not spawned by the Jenkins build. For example:
BUILD_ID=dontKillMe /usr/apache/bin/httpd