【问题标题】:child_process.execFile() without bufferingchild_process.execFile() 没有缓冲
【发布时间】:2017-05-06 15:51:00
【问题描述】:

我正在使用 Node 的 child_process.execFile() 启动并与将其所有输出放入其标准输出和错误流的进程进行通信。该过程运行的时间不确定,理论上可以产生任意数量的输出,即:

const process = execFile('path/to/executable', [], {encoding: buffer'});
process.stdout.on('data', (chunk) => {
    doSomethingWith(chunk);
});
process.stderr.on('data', (chunk) => {
    renderLogMessage(chunk);
});

请注意,我没有使用 execFile() 的最后一个参数,因为我从不需要来自任何一个流的所有数据的聚合视图。尽管有这个遗漏,但 Node 似乎无论如何都在缓冲输出,我可以可靠地以 SIGTERM 信号结束进程,只需为其提供足够的输入以生成大量输出。这是有问题的,因为进程是有状态的,不能简单地定期重新启动。

如何更改或解决此问题?

【问题讨论】:

    标签: node.js stdout child-process stderr


    【解决方案1】:

    你不想使用execFile,它会在“返回”之前等待子进程退出(通过调用你没有传递的回调)。

    The documentation for execFile 还描述了您的子进程被终止的原因:

    maxBuffer <number> stdout 或 stderr 上允许的最大数据量(以字节为单位)。 (默认:200*1024)如果超过,则终止子进程。

    对于要增量读取 stdout/stderr 的长时间运行的进程,请使用 child_process.spawn()

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 2014-06-23
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      相关资源
      最近更新 更多