【问题标题】:node exec() not firing all data eventsnode exec() 没有触发所有数据事件
【发布时间】:2016-08-27 18:04:08
【问题描述】:

似乎足够大的标准输出输出节点不会触发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

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    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

    【讨论】:

    • 我在帖子中确实提到我尝试用 exec 替换 spawn 并得到相同的输出 - 正是出于缓冲原因
    • 哦,没关系,当然,在我去发布堆栈溢出并再次尝试我在它最终工作之前尝试过的事情之一之后:|该死的。谢谢!
    • @tak3r - 然后,请向我们展示您与.spawn() 一起使用的代码,因为它应该能够接收无限的标准输出流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多