node exec()未触发所有数据事件
node exec() not firing all data events
对于足够大的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之间的区别被缩短了。
相关文章:
- 将单击事件添加到数据表
- node.js请求数据事件未在CORS ajax调用中触发
- node exec()未触发所有数据事件
- Node.js输入数据事件停止
- 如何从节点.js请求对象读取数据事件(块)
- IE8:触发“加载元数据”事件
- Firefox 加载元数据事件
- 节点 ssh2 为一个简单的 ls 命令发送多个数据事件
- 未定义的 JWPlayer 元数据事件
- 数据事件未触发节点.js
- 具有多个“数据”事件处理程序和竞争条件的 NodeJS 流
- Nodejs正在侦听来自http.get()的数据事件的响应流
- process.stdin流的可读事件和数据事件有什么区别
- <视频>和加载的元数据事件
- 加载数据事件永远不会触发
- 用于数据事件的JavaScript选择器
- swf加载元数据事件
- 变量未在请求 JS 的数据事件中更新
- Node.js请求数据事件未触发.我做错了什么?
- 在数据事件中访问c3js中的数据值