首页 > 解决方案 > Node.js 在接收 SIGTERM 时的默认行为是什么?

问题描述

我一直在阅读文档,但没有明确说明如果没有注册信号处理程序,Node.js 进程是否立即退出。例如,轮询队列中的待处理任务是否已执行或是否所有内容都已删除?程序员是否总是必须通过跟踪所有待处理的 Promise 来显式地处理正常关闭?

标签: javascriptnode.jssignals

解决方案


当没有添加处理程序时SIGTERM,节点将重置终端并立即退出进程。这是一个“把所有东西都放在原处”的出口。甚至比process.exitwhich 仍然允许exit事件触发更重要:

调用process.exit()将强制进程尽快退出,即使仍有尚未完全完成的异步操作挂起,包括对process.stdout和的 I/O 操作process.stderr

添加信号处理程序时 ( process.once('SIGTERM'),处理程序代码被安排用于下一个事件循环。因此即使您只是调用process.exit()处理程序,行为也会立即改变。

Promise 或一般的 Javascript 还没有内置取消的概念。您可以跟踪承诺,但除非使用底层 API 专门解决取消任务的方法,否则没有什么可做的。

不过你可以。在一般的 Web 应用程序中,如果您关闭 Web 服务器并关闭数据库连接。现有连接将完成,不会启动新连接,最终当事件循环上没有任何东西可以运行时,进程将自行退出。wtfnode可以方便地帮助调试最终不会像这样退出的进程。


推荐阅读