我使用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
信号提供足够的输入来生成大量输出,从而可靠地使过程结束。这是有问题的,因为该过程是有状态的,不能简单地定期重新启动。
如何更改或解决此问题?
答案 0 :(得分:0)
您不想使用execFile
,这将等待子流程退出"返回" (通过调用你没有通过的回调)。
The documentation for execFile
还描述了您的子进程被终止的原因:
maxBuffer
<number>
stdout或stderr允许的最大字节数。 (默认值:200*1024
)如果超出,子进程将终止。
对于要逐步读取stdout / stderr的长时间运行的进程,请使用child_process.spawn()
。