node exec()未触发所有数据事件

node exec() not firing all data events

本文关键字:数据 事件 exec node      更新时间:2023-09-26

对于足够大的stdout输出节点,似乎不会触发data事件:

bash脚本示例:

#!/usr/bin/env sh
for i in {1..100000}; do
    echo $i
done

从bash运行上面的脚本应该打印从1到100k的所有数字,每行一个数字

然而,当通过节点的exec:代理它时

#!/usr/bin/env node --harmony --harmony_destructuring --harmony_default_parameters
const {exec} = require('child_process');
let stdout = '';
const child = exec('./tmp.sh');
child.stdout.on('data', data => {
    stdout += data;
});
child.stdout.on('close', code => {
    if (code) process.exit(code);
    console.log(stdout.split(''n').slice(0, 3).join(''n'));
    console.log('...');
    console.log(stdout.split(''n').slice(-3).join(''n'));
});

对于上面的脚本,我希望得到:

1
2
3
...
99998
99999
100000

然而,当运行时返回:

1
2
3
...
35984
35985

大约三分之一的输出被截断。data处理程序内部的日志记录显示,使用1个区块只触发1个数据事件

我试着听child.on('exit')事件,但得到了相同的结果(也是stdout.on('exit')

exec替换为spawn 时,其工作原理相同

node --version # v5.4.1
osx 10.10

child_process.exec()将标准输出缓冲到固定大小的缓冲区中。您可能正在填充缓冲区,因此无法获得其余的输出。

有一个maxBuffer选项可以传递给.exec()以使缓冲区更大,也可以使用.spawn()接收无限制的输出流。

有关信息,请参阅使用节点子进程的标准输出缓冲区问题。

同样值得一读的是:Node.js child_process的spawn和exec与Node.js child_process exec的Stdout之间的区别被缩短了。