【发布时间】:2016-04-16 01:52:17
【问题描述】:
我有这个在 Elastic Beanstalk 中运行的 Nodejs 应用程序。我想在应用程序退出时进行一些清理(例如部署新版本,重新启动应用程序服务器)。为此,我正在收听一些事件和信号,但似乎都没有被触发。以下是 app.js 中的代码:
process.on("SIGTERM", function() {
console.log("SIGTERM, clean");
process.exit(0);
});
process.on("exit", function(code) {
console.log("Process exiting with code " + code);
});
process.on("uncaughtException", function() {
console.log("Unhandled exception occurred);
process.exit(99);
});
当我通过管理控制台重新启动应用程序时,我在日志中看不到任何内容,即使创建了一个新的节点进程并杀死了旧的节点进程。
如果我手动终止进程,我可以在输出中看到日志消息。这是否意味着 Beanstalk 触发的事件不会发送终止信号?如果是这样,怎么可能做一些优雅的退出?
编辑:这是更多调查的结果。 Beanstalk 使用 Upstart 来管理应用程序。在 /etc/init/nodejs 中有这样一行:
exec su -s /bin/sh -c 'PATH=$PATH:$NODE_HOME/bin $EB_NODE_COMMAND 2>&1' nodejs >> /var/log/nodejs/nodejs.log
运行npm start,它使用package.json 配置启动应用程序。这是我拥有的进程树:
root 29155 su -s /bin/sh -c PATH=$PATH:$NODE_HOME/bin $EB_NODE_COMMAND 2>&1 nodejs
nodejs 29156 \_ sh -c PATH=$PATH:$NODE_HOME/bin $EB_NODE_COMMAND 2>&1
nodejs 29157 \_ npm
nodejs 29168 \_ node app/app.js
initctl status nodejs 显示第一个进程的 pid。所以我猜Upstart会向这个进程发送一个SIGTERM,它不会一直转发到我的进程。不幸的是,我仍然不知道如何解决这个问题。
【问题讨论】:
-
这有什么更新吗?你找到办法了吗?
-
@clay:不,AWS 支持没有更新,我也没有解决方案。尝试过@pcothenet 提出的替代方法吗?
-
感谢您的回复。我可能不得不尝试那个“未记录且不受支持”的脚本。 . .只希望有更好的方法!我希望 Node beanstalk 会在这方面有更新,但我认为很多焦点都集中在 Docker beanstalk 上,并且可能存在类似的选项。彻底关闭服务器应该很重要!
-
看起来这仍然是今天的状态,有没有人更好地理解这是为什么?
标签: node.js amazon-web-services signals amazon-elastic-beanstalk