Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 处理信号,在Elastic Beanstalk上使用nodejs应用程序优雅退出?_Node.js_Amazon Web Services_Signals_Amazon Elastic Beanstalk - Fatal编程技术网

Node.js 处理信号,在Elastic Beanstalk上使用nodejs应用程序优雅退出?

Node.js 处理信号,在Elastic Beanstalk上使用nodejs应用程序优雅退出?,node.js,amazon-web-services,signals,amazon-elastic-beanstalk,Node.js,Amazon Web Services,Signals,Amazon Elastic Beanstalk,我有一个在弹性豆茎中运行的Nodejs应用程序。我想在应用程序退出时进行一些清理(例如部署新版本,重新启动应用程序服务器)。为了做到这一点,我听到了一些事件和信号,但它们似乎都没有被触发。下面是app.js中的代码: 当我通过管理控制台重新启动应用程序时,我在日志中看不到任何内容,即使创建了一个新的节点进程,并且旧的节点进程被终止。 如果我手动终止进程,我可以在输出中看到日志消息。这是否意味着豆茎触发的事件不会发送杀死信号?如果是这样的话,怎样才能优雅地退出呢 编辑:以下是进一步调查的结果。 B

我有一个在弹性豆茎中运行的Nodejs应用程序。我想在应用程序退出时进行一些清理(例如部署新版本,重新启动应用程序服务器)。为了做到这一点,我听到了一些事件和信号,但它们似乎都没有被触发。下面是app.js中的代码:

当我通过管理控制台重新启动应用程序时,我在日志中看不到任何内容,即使创建了一个新的节点进程,并且旧的节点进程被终止。
如果我手动终止进程,我可以在输出中看到日志消息。这是否意味着豆茎触发的事件不会发送杀死信号?如果是这样的话,怎样才能优雅地退出呢

编辑:以下是进一步调查的结果。 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,它不会一直转发到我的流程。不幸的是,我仍然不知道如何解决这个问题。

不幸的是,AWS支持部门确认目前没有解决办法。已经为Beanstalk开发团队创建了一个功能请求,但谁知道该请求何时实现。

似乎有一种未经记录的方式通过向
hooks/appdeploy
文件夹添加脚本来“拦截”SIGKILL:


这几乎没有文档记录,AWS支持人员向我指出了这一点。对此有任何更新吗?你找到办法了吗?@clay:没有,AWS支持部门没有更新,我这边也没有解决方案。您是否尝试过@pcothenet提出的替代方法?谢谢您的回复。我可能不得不尝试那个“未记录且不受支持”的脚本。但愿有更好的办法!我希望Node beanstalk在这方面会有一个更新,但我认为最主要的关注点是Docker beanstalk,可能存在类似的选项。干净地关闭服务器应该很重要!看起来到今天为止,这仍然是一种状态,有人能更好地理解为什么会这样吗?
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