Node.js 使用jenkins在EC2上运行pm2不工作?
我正在AWS EC2服务器上运行我的节点应用程序。 对于持续集成,我安装了Jenkins,在EC2上,Jenkins连续轮询代码提交,当提交发生时,执行脚本中编写的一些命令 最后一个命令是 pm2启动服务器.js 一切正常,构建显示成功,但稍后当我访问该URL时,该站点不会显示 我在节点服务器前面有一个nginx服务器,它提供 502坏网关 检查时,我意识到节点应用程序没有运行,因此我查看了pm2日志,发现发生了这种情况- 2016-08-12 07:53:28:[[[PM2/上帝守护进程启动]]] 2016-08-12 07:53:28:port/var/lib/jenkins/.pm2/pub.sock上的总线系统[准备就绪] 2016-08-12 07:53:28:端口/var/lib/jenkins/.pm2/RPC.sock上的RPC接口[就绪] 2016-08-12 07:53:28:在-分叉模式下启动执行序列-对于应用程序名称:服务器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.3Node.js 使用jenkins在EC2上运行pm2不工作?,node.js,jenkins,amazon-ec2,pm2,Node.js,Jenkins,Amazon Ec2,Pm2,我正在AWS EC2服务器上运行我的节点应用程序。 对于持续集成,我安装了Jenkins,在EC2上,Jenkins连续轮询代码提交,当提交发生时,执行脚本中编写的一些命令 最后一个命令是 pm2启动服务器.js 一切正常,构建显示成功,但稍后当我访问该URL时,该站点不会显示 我在节点服务器前面有一个nginx服务器,它提供 502坏网关 检查时,我意识到节点应用程序没有运行,因此我查看了pm2日志,发现发生了这种情况- 2016-08-12 07:53:28:[[[PM2/上帝守护进程启动]
工作已停止,请立即寻求帮助。答案在Dusan Bajic给出的评论中,如果有人正在使用节点应用程序在EC2上与jenkins进行持续集成,并且pm2也发生类似情况,请在启动pm2之前在脚本中添加这一行 导出生成\u ID=dontKillMePlease 而不是 pm2启动服务器.js 使用 pm2重启服务器.js
server.js是您的应用程序,否则在jenkins中,如果您提交并再次运行脚本,构建将失败,因为pm2已经在运行server.js并且不会停止。答案在Dusan Bajic给出的注释中,如果有人在EC2上使用节点应用程序与jenkins进行持续集成,pm2也会发生类似的情况,只需在启动pm2之前在脚本中添加这一行即可 导出生成\u ID=dontKillMePlease 而不是 pm2启动服务器.js 使用 pm2重启服务器.js 如果在jenkins中提交并再次运行脚本,则作为您的应用程序的server.js或其他构建将失败,因为pm2已经在运行server.js并且不会停止。From 为了在构建过程中可靠地杀死作业生成的进程,Jenkins 包含一些本机代码来列出这些进程并杀死它们 工作原理 ProcessTreeKiller利用了以下事实: 默认情况下,新进程将获取其 生成/创建过程 它在执行过程中设置特定的环境变量 建造工作。稍后,当用户请求停止生成作业的 进程它获取计算机上运行的所有进程的列表,以及 它们的环境变量,并查找环境变量 它最初为构建作业的流程设置 然后,在其环境中包含该环境变量的每个作业 终止 如果您的构建想要留下一个后台进程运行 实现这一点的一个方便方法是更改环境变量 Jenkins的ProcessTreeKiller正在寻找的构建ID。这将 让Jenkins假设你的守护进程不是由Jenkins产生的 建筑例如: BUILD_ID=dontKillMe/usr/apache/bin/httpd 从 为了在构建过程中可靠地杀死作业生成的进程,Jenkins 包含一些本机代码来列出这些进程并杀死它们 工作原理 ProcessTreeKiller利用了以下事实: 默认情况下,新进程将获取其 生成/创建过程 它在执行过程中设置特定的环境变量 建造工作。稍后,当用户请求停止生成作业的 进程它获取计算机上运行的所有进程的列表,以及 它们的环境变量,并查找环境变量 它最初为构建作业的流程设置 然后,在其环境中包含该环境变量的每个作业 终止 如果您的构建想要留下一个后台进程运行 实现这一点的一个方便方法是更改环境变量 Jenkins的ProcessTreeKiller正在寻找的构建ID。这将 让Jenkins假设你的守护进程不是由Jenkins产生的 建筑例如: BUILD_ID=dontKillMe/usr/apac he/bin/httpd
如果您在shell步骤的开始部分很好地询问它是否有帮助:export BUILD\u ID=dontkillme请:它起作用了。为什么会发生这样的事呢。非常感谢。如果您在shell步骤开始时问得很好,会有帮助吗:export BUILD\u ID=dontkillme请:它成功了。为什么会发生这样的事呢。非常感谢。嗨。我也有同样的问题,我的jenkins shell只是一个要执行的命令。/deploy.sh。我尝试了BUILD_ID=dontKillMe./deploy.sh和BUILD_ID=dontKillMePlease./deploy.sh,但仍然无法解决502坏网关的问题。我在构建后检查了PM2日志,但没有发现PM2被信号杀死。。。。你知道吗?它对我有用,但我必须去Jenkins项目配置,在我的构建步骤execute shell中,我必须编写build_ID=dontKillMe./build.sh。不要在build.sh脚本本身中使用它-我想我需要在启动被杀死的守护进程的行上放置build_ID,但实际上必须在Jenkins配置中的整个脚本上放置build_ID。虽然这很奇怪,但出口对我不起作用——也许在没有“请”的情况下使用它会起作用。我也有同样的问题,我的jenkins shell只是一个要执行的命令。/deploy.sh。我尝试了BUILD_ID=dontKillMe./deploy.sh和BUILD_ID=dontKillMePlease./deploy.sh,但仍然无法解决502坏网关的问题。我在构建后检查了PM2日志,但没有发现PM2被信号杀死。。。。你知道吗?它对我有用,但我必须去Jenkins项目配置,在我的构建步骤execute shell中,我必须编写build_ID=dontKillMe./build.sh。不要在build.sh脚本本身中使用它-我想我需要在启动被杀死的守护进程的行上放置build_ID,但实际上必须在Jenkins配置中的整个脚本上放置build_ID。虽然这很奇怪,但导出对我不起作用——也许在没有“请”的情况下使用它会起作用