我正在AWS EC2服务器上运行我的节点应用程序。 为了持续集成,我在EC2上安装了Jenkins,jenkins连续轮询代码提交,当发生提交时,执行一些用脚本编写的命令。
最后一个命令是
pm2 start server.js
一切正常,构建显示成功,但稍后当我访问网站未显示的URL时。
我在节点服务器前面有一个nginx服务器,它给出了 502 Bad Gateway
在检查时,我意识到节点应用程序没有运行,所以我查看了pm2日志并发现了这种情况 -
2016-08-12 07:53:28:[[[[PM2 / God daemon launch]]]]
2016-08-12 07:53:28:端口/var/lib/jenkins/.pm2/pub.sock上的BUS系统[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:停止app:服务器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
请停止工作,请立即寻求帮助。
答案 0 :(得分:2)
答案在Dusan Bajic给出的评论中,如果有人在使用节点应用程序在EC2上与jenkins持续集成,并且在pm2中发生类似的事情,只需在开始pm2之前在脚本中添加此行。
导出BUILD_ID = dontKillMePlease
而不是
pm2 start server.js
使用
pm2重新启动server.js
server.js是您的应用程序,否则构建将失败如果在jenkins中,如果您提交并且它再次运行脚本导致pm2已经在运行server.js并且不会停止。
答案 1 :(得分:1)
在构建期间可靠地杀死作业产生的进程,Jenkins 包含一些本机代码来列出这些进程并杀死它们
...
工作原理
ProcessTreeKiller充分利用了这个事实 默认情况下,新进程获取其环境变量的副本 产卵/创造过程。
它在执行的过程中设置一个特定的环境变量 建立工作。稍后,当用户请求停止构建作业时 进程它获取计算机上运行的所有进程的列表 他们的环境变量,并寻找环境变量 它最初为构建作业的过程设置。
然后,在其环境中使用该环境变量的每个作业 终止。
如果你的构建想让守护进程落后......
实现这一目标的便捷方法是更改环境变量 Jenkins的ProcessTreeKiller正在寻找的BUILD_ID。这将 导致Jenkins认为您的守护进程不是由Jenkins生成的 建立。例如:
BUILD_ID=dontKillMe /usr/apache/bin/httpd