处理信号在Elastic Beanstalk上使用nodejs应用程序进行优雅退出?

我有这个在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); }); 

当我通过pipe理控制台重新启动应用程序时,即使创build了一个新的节点进程并且旧的进程被终止,我也没有看到日志中的任何内容。
如果我手动杀死进程,我可以在输出中看到日志消息。 这是不是意味着Beanstalk触发的事件不发送kill信号? 如果是这样,怎么可能做一些优美的退出?

编辑 :这是更多调查的结果。 Beanstalk使用Upstart来pipe理应用程序。 在/ 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 config启动应用程序。 这里是我有的过程树:

 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 ,这个过程不会一直转发到我的过程。 不幸的是,我仍然不知道如何解决这个问题。

不幸的是,AWS支持确认现在没有解决方法。 已经为Beanstalk开发团队创build了一个function请求,但是谁知道什么时候才能实现。

似乎有一个没有logging的方法来通过在hooks/appdeploy文件夹中添加一个脚本来“拦截”SIGKILL:

https://forums.aws.amazon.com/thread.jspa?messageID=493887

这几乎没有文档logging,AWS支持也不支持这一点。