Nodejs 信号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs 信号相关的知识,希望对你有一定的参考价值。

参考技术A 当Nodejs 进程接收一个信号时,会触发信号事件。我们通过 man kill 来查看所有的信号事件

强制迫使进程在运行时候突然终止,进程再结束后不能自我清理。可能会到导致系统资源无法正常释放

友好的告诉进程退出,进程先保存好数据,然后再正常退出。
给父进程发送一个TERM信号,试图杀死它和它的子进程。

和 ctrl +c 效果一致
用户键入由终端驱动程序发送的信号。这是一个终止当前操作的请求,如果捕捉了这个信号,一些 简单的 应用程序应该退出,这也是程序如果没有捕获这个信号时的默认处理方法。它的传统含义是 停止你正在做的事情并等待进一步的用户输入

HUP和TREM大致相同,但是他有特定作用。当用户从终端断开连接时候,他会自动到发送终端运行的应用程序。 HUP 通常是非自愿的,不像 TERM 明确发送。

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

【中文标题】处理信号以在 Elastic Beanstalk 上使用 nodejs 应用程序优雅退出?【英文标题】:Process signals to do a graceful exit with a nodejs app on Elastic Beanstalk? 【发布时间】: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 上,并且可能存在类似的选项。彻底关闭服务器应该很重要! 看起来这仍然是今天的状态,有没有人更好地理解这是为什么? 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

这几乎没有文档记录,并且 AWS 支持不支持我指出这一点。

【讨论】:

以上是关于Nodejs 信号的主要内容,如果未能解决你的问题,请参考以下文章

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

node.js怎么监听程序强制退出

node.js怎么监听程序强制退出

多个nodejs应用程序之间的进程间通信

NodeJs Socket.io 房间

NodeJs Socket.io Rooms