node.js child_process.spawn no stdout除非'inherit'

时间:2014-07-08 13:17:47

标签: javascript node.js stdout stderr child-process

我试图从spawn(0.10.29)中的child_process ed node.js抓取标准输出。

现在我只是尝试ping

以下代码不会打印(但会ping)

var exec = require('child_process').exec;
var spawn = require('child_process').spawn;
var util = require('util')

var ping = spawn('ping', ['127.0.0.1'], {stdio: 'pipe'});

ping.stdout.on('data', function(data){
    util.print(data);
})

ping.stderr.on('data', function(data){
    util.print(data);
})

如果我将stdio: 'pipe'更改为stdio: 'inherit'并删除stdout/stderr这样的挂钩:

var ping = spawn('ping', ['127.0.0.2'], {stdio: 'inherit'});

// ping.stdout.on('data', function(data){
//  util.print(data);
// })

// ping.stderr.on('data', function(data){
//  util.print(data);
// })

我得到了

PING 127.0.0.2 (127.0.0.2): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1

如果我将地址从127.0.0.2更改为127.0.0.1,我知道这会响应ping并使用原始代码

PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.060 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.063 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.152 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.124 ms

当ping不是datapinging时,为什么stdout / stderr没有触发inheriting事件的任何想法?

1 个答案:

答案 0 :(得分:0)

在控制台打印方面,在分块和缓冲方面,已经有很多问题修复和功能改进。由于问题不再具有可再现性,我认为这可能是由于当时节点的一个记录不足的行为,基于可用于打印的数据字节数。

由于这个问题仍然存在,我会要求发端人看看你是否对这个解释感到满意,或者正在寻找更具体的解释,这种情况我需要在节点的所述版本中重现这一点并进一步调试。