Node.js 在接收 SIGTERM 时的默认行为是什么?

Kev*_* Lu 8 javascript signals node.js

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

Mat*_*att 9

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

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

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

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

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

  • 通常最好假设您的节点进程可以随时消失,因为它可以,并且它应该恢复启动时留下的任何内容。通常非原子数据库更新需要包装在事务中。某些用户事务可能需要可重新启动。也许可以提出一个问题,并举出您担心飞行途中失败的具体例子 (2认同)