gpt4 book ai didi

javascript - Node 执行()不触发所有数据事件

转载 作者:搜寻专家 更新时间:2023-10-31 23:41:26 26 4
gpt4 key购买 nike

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

示例 bash 脚本:

#!/usr/bin/env sh

for i in {1..100000}; do
echo $i
done

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

然而,当通过 Node 的 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

大约三分之一的输出被 chop 。在 data 处理程序中登录显示只有 1 个数据事件被 1 个 block 触发

我试过监听 child.on('exit') 事件而不是相同的结果(还有 stdout.on('exit'))

exec 替换为 spawn 时效果相同

node --version # v5.4.1
osx 10.10

最佳答案

child_process.exec() 将标准输出缓冲到 fixed size buffer 中.您可能正在填充缓冲区,因此您无法获得剩余的输出。

有一个 maxBuffer 选项,您可以将其传递给 .exec() 以增大缓冲区,或者您可以使用 .spawn()并接收无限的输出流。

参见 Stdout buffer issue using node child_process获取相关信息。

还值得一读:Difference between spawn and exec of Node.js child_processStdout of Node.js child_process exec is cut short .

关于javascript - Node 执行()不触发所有数据事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com