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()
。
我正在使用 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()
。