2017-05-06 170 views
0

我使用节点的child_process.execFile()启动,并与将所有输出到其标准输出和错误流的进程进行通信。该过程运行的时间不确定量和理论上可以产生任何输出量,即:那我不使用的最后一个参数execFile()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); 
}); 

注意,因为我从来没有需要的所有数据的聚合视图是从任何一个流都出来了。尽管有这种遗漏,Node似乎仍在缓冲输出,并且我可以通过给它足够的输入来产生大量的输出,从而可靠地使该过程以SIGTERM信号结束。这是有问题的,因为这个过程是有状态的,不能简单地定期重启。

我如何改变或变通解决此问题?

回答

0

你不想使用execFile,这将等待子进程“回归”之前退出(通过调用你没有传递回调)。

The documentation for execFile还介绍了为什么你的子进程被终止:允许在标准输出或标准错误

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

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