2014-01-16 32 views
2

我最近一直在使用Node.js,并且遇到问题,找到一种方法来跟踪返回请求的子进程stdout的结果。保持产生进程的Node.js结果的顺序

我有一个文件中的主机名列表,我的应用程序读取文件,使用一个简单的正则表达式一次从文件中拉出主机名一行,使用拆分。然后我创建一个主机名数组。然后,为数组中的每个主机名创建一个参数字符串,并使用该参数字符串产生一个进程,但是,我无法从进程内部访问计数变量“i”,并且我无法找到跟踪结果返回到输入。

我的程序应该采用每个主机名称并使用“子进程”调用snmp,然后它应该创建和{hostname:“snmp-result”}的数组,并且最后一次完成后,将该数组保存到文件中。

我正在使用此程序尝试从网络设备中提取序列号。我已经重写了这段代码大约5次,我甚至用嵌套在spawn过程中的函数尝试了它,而不是在数据事件发射器上,但是我很茫然。相关代码如下:

var spawn = require('child_process').exec; 
var split = require('split'); 
var fs = require('fs'); 
var snRe = '"(.*?)"'; 
var devRe = "(junos\\-([a-z]|[0-9])+\\-([a-z]|[0-9])+$)"; 
var devices = []; 
var output = []; 
var outfile = fs.createWriteStream('vri.txt',{'flags':'w'}); 
var infile = fs.createReadStream('devices',{flags: 'r', encoding: 'utf8'}) 
var spawnCmd = "/usr/local/bin/snmpwalk -v2c -c public" 
var oid = ".1.3.6.1.4.1.2636.3.1.3" 

function getSerial(callback) { 

    for (var i=0;i<devices.length;i++) { 
      var argument = spawnCmd + " " + devices[i] + " " + oid; 
      ps = spawn(argument); 
      ps.stdout.on('data',function(buf) { 
        if (buf) { 
          output.push(devices[i] + ": " + (buf.match(snRe))[1] +"\n"); 
        } 
        else { 
        output.push('could not be reached'); 
        } 
        }) 
        //console.log(i + devices[i] + ": " + output[i] + '\n'); 
      } 
    } 
callback(); 
} 

getDevices(function() { 
    getSerial(function() { 
      for (var i=0;i<output.length;i++) { 
    outfile.write(output[i]); 

} 
    }) 
}) 

回答

2

由于产卵过程的异步性质,您不能使用for循环来处理这样的程序。递归是你的朋友在这里。

var spawn = require('child_process').exec; 
var max = 3; 

function genSerial(bufs, callback) { 
    if(bufs.length === max) { 
    callback(null, bufs); 
    return; 
    } 
    var ps = spawn('sleep 1; date'); 
    ps.stdout.on('data',function(buf) { 
    console.log(buf); 
    bufs.push(buf); 
    genSerial(bufs, callback); 
    }); 
} 

genSerial([], function(err, bufs) { 
    console.log('showing buffers', bufs); 
}); 

和输出

[email protected]:~/Documents/so$ node test.js 
Fri Jan 17 06:54:58 NZDT 2014 

Fri Jan 17 06:54:59 NZDT 2014 

Fri Jan 17 06:55:00 NZDT 2014 

showing buffers [ 'Fri Jan 17 06:54:58 NZDT 2014\n', 
    'Fri Jan 17 06:54:59 NZDT 2014\n', 
    'Fri Jan 17 06:55:00 NZDT 2014\n' ] 
+0

它老老实实从来没有想过我做这种方式。节点是我第一次深入研究异步编程。看着你的解决方案,一盏灯刚刚熄灭。这是不仅我的问题得到回答的那些时刻之一,而且你开始考虑这将如何彻底改变我看待问题的方式。 – bufo333

+0

非常感谢作品 – bufo333

+0

很高兴帮助。要更习惯于异步编程,可以查看http://www.slideshare.net/cacois/nodejs-patterns-for-discerning-developers或其他类似的东西 – leorex