我有这个在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 ,它不会一直转发到我的进程。不幸的是,我仍然不知道如何解决这个问题。
答案 0 :(得分:1)
不幸的是,AWS支持证实目前没有解决方法。已经为Beanstalk开发团队创建了一个功能请求,但谁知道何时实现它。
答案 1 :(得分:1)
似乎有一种未记录的方法通过向EOFException
文件夹添加脚本来“拦截”SIGKILL:
https://forums.aws.amazon.com/thread.jspa?messageID=493887
这几乎没有记录,AWS支持人员不支持这一点。