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

7

我一直在阅读文档,但并没有明确说明如果没有注册信号处理程序,Node.js进程是否会立即退出。例如,轮询队列中的待定任务是否会执行,还是所有内容都被丢弃?程序员是否总是需要通过跟踪所有待处理的 Promise 明确地处理优雅关闭?

1个回答

7
当没有为 SIGTERM 添加处理程序时,Node.js 将重置终端并立即退出进程。这是一个“放弃一切”的退出方式。比 process.exit(它仍允许exit事件发生) 更加如此:

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

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

Promise 或 JavaScript 通常还没有内置取消概念。您可以跟踪 Promise,但除非正在使用的底层 API 明确解决了取消任务的方法,否则不会有太多事情可以做。

你可以等待。在普通的Web应用程序中,如果关闭Web服务器和数据库连接,则现有连接将完成,不会启动新连接,最终当事件循环上没有要运行的内容时,进程会自行退出。wtfnode 可以帮助调试这样没有最终退出的进程。

谢谢。我正在开发 Discord 机器人,它们的功能与 Web 应用程序类似,不同之处在于它们响应来自 WebSocket 的事件。断开连接是有效的,但我认为即使使用 Web 应用程序,在进行处理的请求依赖于数据库时,我们也不能直接在 SIGTERM 上断开数据库连接。但如果不断开数据库连接,则进程在发送第二个信号之前无法正确退出。是否有解决方案或需要两个信号终止是可以接受和标准的吗? - Kevin Lu
2
通常最好假定您的节点进程随时可能消失,因为它确实可以,并且应该在启动时恢复留下的任何内容。通常非原子数据库更新需要包装在事务中。某些用户事务可能需要重启。也许可以提出一个具体示例的问题,涉及到在执行过程中失败的情况。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接