退出之前在 Node.js 进程中刷新/排出 stdout/stderr

问题描述 投票:0回答:1

是否有一种防火方法可以保证 Node.js 进程中的所有

stdout
stderr
在允许 Node.js 进程完全终止之前都已到达目的地(尽可能多)?

在某些情况下,我一直看到 stdout 和 stderr 在终止之前无法脱离 Node.js 进程。

我的想法是:

process.once('exit', function(){

   // use some synchronous call to flush or drain stdout and stderr

});

有人找到了可靠的方法吗?大多数情况下我还没有看到这个问题发生,但我只是在寻找任何可能的方法来为此添加一些额外的保险。

node.js stdout stderr
1个回答
0
投票

根据我的经验,这里有一个可靠的方法来处理这个问题:

const flushStreams = () => {
  return new Promise(resolve => {
    // Force flush stdout
    if (process.stdout.writableLength) {
      process.stdout.write('', () => {
        // Then flush stderr if needed
        if (process.stderr.writableLength) {
          process.stderr.write('', resolve)
        } else {
          resolve()
        }
      })
    } else {
      resolve()
    }
  })
}
// Handle process termination
;['SIGINT', 'SIGTERM'].forEach(signal => {
  process.on(signal, async () => {
    await flushStreams()
    process.exit(0)
  })
})

这个方法:

  1. 使用
    writableLength
  2. 检查是否有待处理的数据
  3. 使用空写入强制刷新
  4. 处理标准输出和标准错误
  5. 与异步/等待一起使用以获得更好的控制

由于 Node 的事件循环性质,不能 100% 保证,但这是我在生产中发现的最可靠的方法。

© www.soinside.com 2019 - 2024. All rights reserved.