我最近一直在使用Node.js,我在找到跟踪子进程stdout返回请求结果的方法时遇到了问题。
我有一个文件中的主机名列表,我的应用程序读取文件,使用一个简单的正则表达式,一次一行地从文件中提取主机名,使用拆分。然后我创建一个主机名数组。然后对于数组中的每个主机名,我构建一个参数字符串,并使用该参数字符串生成一个进程,但是,我无法从进程内部访问计数变量“i”,我找不到跟踪它的方法结果回到输入。
我的程序应该使用每个主机名并使用“子进程”调用snmp,然后它应该创建{hostname:“snmp-result”}的数组,最后一旦完成,将数组保存到文件中。 / p>
我正在使用此程序尝试从网络设备中提取序列号。我已经重写了这个代码大约5次,我甚至尝试使用嵌套在spawn进程中的函数而不是on数据事件发射器,但是我很茫然。相关代码如下:
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]);
}
})
})
答案 0 :(得分:2)
由于spawn进程的异步性质,你不能使用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);
});
,输出
benny@benny-VirtualBox:~/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' ]