Node.js创建一个模块来收集内存(ram)信息?

时间:2013-12-14 23:37:25

标签: javascript node.js

我要做的是在Windows机器上的Node.js中每X(在这种情况下只有1秒)打印出本地内存使用量。具有实际数据收集功能的代码需要在一个单独的模块中。这是我目前的代码:

server.js中的

mem_stats = require("./mem_stats.js");

setInterval(function () {
  mem_stats.update();
  console.log(mem_stats.mem_total);
}, 1000);
mem_stats.js中的

var exec = require("child_process").exec,
  mem_total,
  mem_avail,
  mem_used;

exports.update = function () {
  exec("wmic ComputerSystem get TotalPhysicalMemory", function (error, stdout, stderr) {
    mem_total = parseInt(stdout.split("\r\n")[1].toString()) / 1073741824; // 1024^3
  });

  exec("wmic OS get FreePhysicalMemory", function (error, stdout, stderr) {
    mem_avail = parseInt(stdout.split("\r\n")[1]) / 1048576; // 1024^2
  });
}

exports.mem_total = mem_total;
exports.mem_avail = mem_avail;
exports.mem_used = mem_total - mem_avail;

我怀疑(/非常肯定)它与JS的异步方式有关但我似乎无法找到解决它的方法(使用回调等)。我现在已经尝试了很多东西,但无论我做什么,我总是最终打印出undefined ......

将我的代码更改为类似的东西也没有解决任何问题:

function mem_total () {
  var temp;
  exec("wmic ComputerSystem get TotalPhysicalMemory", function (error, stdout, stderr) {
    temp = parseInt(stdout.split("\r\n")[1].toString()) / 1073741824; // 1024^3
  });
  return temp;
};

function mem_avail () {
  var temp;
  exec("wmic OS get FreePhysicalMemory", function (error, stdout, stderr) {
    temp = parseInt(stdout.split("\r\n")[1]) / 1048576; // 1024^2
  });
  return temp;
};

exports.mem_total = mem_total();
exports.mem_avail = mem_avail();

我只是不明白。

我知道这个问题可能看起来(相当)有点愚蠢,但我对编码JS没有多少经验,我非常习惯于更多面向C(++)的语言。但无论如何,谢谢。

1 个答案:

答案 0 :(得分:3)

对于第二个示例,命令将按以下方式执行

function mem_total () {
  var temp;
  // call exec now. Since it is async, When the function finishes, 
  // call the callback provided
  exec("wmic ComputerSystem get TotalPhysicalMemory", function (error, stdout, stderr) {
    // temp is modified AFTER mem_total has returned
    temp = parseInt(stdout.split("\r\n")[1].toString()) / 1073741824; // 1024^3
  });

  // return temp before exec finishes.
  return temp;
};

也许您想要以下内容:

function mem_total (callback) {
  var temp;
  exec("wmic ComputerSystem get TotalPhysicalMemory", function (error, stdout, stderr) {
    // temp is modified AFTER the function has returned
    temp = parseInt(stdout.split("\r\n")[1].toString()) / 1073741824; // 1024^3

    callback(error, temp);
  });
};

以下列方式调用该函数

mem_total(function(err, mem) {
    if (err) {
        console.log(err);
        return;
    }
    console.log('total memory is ', mem);
});