child_process.execFile() 无缓冲

child_process.execFile() without buffering

我正在使用 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 信号结束,只需为其提供足够的输入以生成大量输出。这是有问题的,因为该进程是有状态的,不能简单地定期重新启动。

如何改变或解决此问题?

您不想使用 execFile,它将等待子进程在 "returning" 之前退出(通过调用您未传递的回调)。

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

maxBuffer <number> Largest amount of data in bytes allowed on stdout or stderr. (Default: 200*1024) If exceeded, the child process is terminated.

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