289 lines
9.5 KiB
JavaScript
289 lines
9.5 KiB
JavaScript
/**
|
|
* windows-cpu module for Node.js to get various load statistics.
|
|
* @module windows-cpu
|
|
* @version 0.1.4
|
|
* @author Kyle Ross <kylerross1324@gmail.com>
|
|
* @license MIT License
|
|
*
|
|
* @requires os
|
|
* @requires child_process
|
|
*
|
|
* @example
|
|
*
|
|
* var cpu = require('windows-cpu');
|
|
*/
|
|
|
|
(function() {
|
|
var platform = require('os').platform(),
|
|
path = require('path'),
|
|
exec = require('child_process').exec,
|
|
execFile = require('child_process').execFile,
|
|
wmic = platform === 'win32'? path.join(process.env.SystemRoot, 'System32', 'wbem', 'wmic.exe') : null,
|
|
emptyFn = function(){},
|
|
findLoad;
|
|
|
|
/*
|
|
* Checks current platform to ensure we are running on `win32`.
|
|
* @private
|
|
* @param {function} cb A callback function to call if there is an error.
|
|
* @returns {boolean} True if `win32` platform, else false.
|
|
*/
|
|
function checkPlatform(cb) {
|
|
if(platform !== 'win32') {
|
|
if(isFunction(cb)) cb(new Error('windows-cpu> [ERROR] This module only works on Windows platforms.'));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Proper checking to see if variable is a function.
|
|
* @private
|
|
* @param {*} fn The variable to check if is a function.
|
|
* @returns {boolean} True if is a function, else false.
|
|
*/
|
|
function isFunction(fn) {
|
|
var getType = {};
|
|
return fn && getType.toString.call(fn) === '[object Function]';
|
|
}
|
|
|
|
/**
|
|
* Gets the total load in percent for process(es) by a specific search parameter.
|
|
* @param {string|number} arg Specific search parameter. Can be a Process ID or Process Name.
|
|
* @param {function} cb A callback function to handle the results (error, results).
|
|
* @example
|
|
*
|
|
* var cpu = require('windows-cpu');
|
|
*
|
|
* // Find the total load for "chrome" processes
|
|
* cpu.findLoad('chrome', function(error, results) {
|
|
* if(error) {
|
|
* return console.log(error);
|
|
* }
|
|
*
|
|
* // results =>
|
|
* // {
|
|
* // load: 8,
|
|
* // found: [
|
|
* // { pid: '900', process: 'chrome', load: 4 },
|
|
* // { pid: '905', process: 'chrome#1', load: 0 },
|
|
* // { pid: '910', process: 'chrome#2', load: 4 }
|
|
* // ]
|
|
* // }
|
|
*
|
|
* console.log('Google Chrome is currently using ' + results.load + '% of the cpu.');
|
|
* });
|
|
*/
|
|
findLoad = exports.findLoad = function findLoad(arg, cb) {
|
|
if(!isFunction(cb)) cb = emptyFn;
|
|
if(!checkPlatform(cb)) return;
|
|
|
|
var cmd = "wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime,IDProcess | findstr /i /c:" + arg;
|
|
exec(cmd, function (error, res, stderr) {
|
|
if(error !== null || stderr) return cb(error || stderr);
|
|
if(!res) return cb('Cannot find results for provided arg: ' + arg, { load: 0, results: [] });
|
|
|
|
var found = res.replace(/[^\S\n]+/g, ':').replace(/\:\s/g, '|').split('|').filter(function(v) {
|
|
return !!v;
|
|
}).map(function(v) {
|
|
var data = v.split(':');
|
|
return {
|
|
pid: +data[0],
|
|
process: data[1],
|
|
load: +data[2]
|
|
};
|
|
});
|
|
|
|
var totalLoad = 0;
|
|
|
|
found.forEach(function(obj) {
|
|
totalLoad += obj.load;
|
|
});
|
|
|
|
var output = {
|
|
load: totalLoad,
|
|
found: found
|
|
};
|
|
|
|
cb(null, output);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Gets the total load in percent for all processes running on the current machine per CPU.
|
|
* @param {function} cb A callback function to handle the results (error, results).
|
|
* @example
|
|
*
|
|
* var cpu = require('windows-cpu');
|
|
*
|
|
* // Get total load on server for each CPU
|
|
* cpu.totalLoad(function(error, results) {
|
|
* if(error) {
|
|
* return console.log(error);
|
|
* }
|
|
*
|
|
* // results (single cpu in percent) =>
|
|
* // [8]
|
|
*
|
|
* // results (multi-cpu in percent) =>
|
|
* // [3, 10]
|
|
* });
|
|
*/
|
|
exports.totalLoad = function totalLoad(cb) {
|
|
if (!isFunction(cb)) cb = emptyFn;
|
|
if (!checkPlatform(cb)) return;
|
|
|
|
execFile(wmic, ['cpu', 'get', 'loadpercentage'], function (error, res, stderr) {
|
|
if(error !== null || stderr) return cb(error || stderr);
|
|
|
|
var cpus = (res.match(/\d+/g) || []).map(function(x) {
|
|
return +(x.trim());
|
|
});
|
|
|
|
cb(null, cpus);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Gets the total load in percent for all Node.js processes running on the current machine.
|
|
* @param {function} cb A callback function to handle the results (error, results).
|
|
* @example
|
|
*
|
|
* var cpu = require('windows-cpu');
|
|
*
|
|
* // Get total load for all node processes
|
|
* cpu.nodeLoad(function(error, results) {
|
|
* if(error) {
|
|
* return console.log(error);
|
|
* }
|
|
*
|
|
* // results =>
|
|
* // {
|
|
* // load: 20,
|
|
* // found: [
|
|
* // { pid: '1000', process: 'node', load: 10 },
|
|
* // { pid: '1050', process: 'node#1', load: 6 },
|
|
* // { pid: '1100', process: 'node#2', load: 4 }
|
|
* // ]
|
|
* // }
|
|
*
|
|
* console.log('Total Node.js Load: ' + results.load);
|
|
* });
|
|
*/
|
|
exports.nodeLoad = function nodeLoad(cb) {
|
|
findLoad('node', cb);
|
|
};
|
|
|
|
/**
|
|
* Gets the total load in percent for all processes running on the current machine per CPU.
|
|
* @param {function} cb A callback function to handle the results (error, results).
|
|
* @example
|
|
*
|
|
* var cpu = require('windows-cpu');
|
|
*
|
|
* // Get load for current running node process
|
|
* cpu.processLoad(function(error, results) {
|
|
* if(error) {
|
|
* return console.log(error);
|
|
* }
|
|
*
|
|
* // results =>
|
|
* // {
|
|
* // load: 10,
|
|
* // found: [
|
|
* // { pid: '1000', process: 'node', load: 10 }
|
|
* // ]
|
|
* // }
|
|
*
|
|
* console.log('Total Process Load: ' + results.load);
|
|
* });
|
|
*/
|
|
exports.processLoad = function processLoad(cb) {
|
|
findLoad(process.pid, cb);
|
|
};
|
|
|
|
/**
|
|
* Gets the name of each processor in the machine.
|
|
* @param {function} cb A callback function to handle the results (error, results).
|
|
* @example
|
|
*
|
|
* var cpu = require('windows-cpu');
|
|
*
|
|
* // Get listing of processors
|
|
* cpu.cpuInfo(function(error, results) {
|
|
* if(error) {
|
|
* return console.log(error);
|
|
* }
|
|
*
|
|
* // results =>
|
|
* // [
|
|
* // 'Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz',
|
|
* // 'Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz'
|
|
* // ]
|
|
*
|
|
* console.log('Installed Processors: ', results);
|
|
* });
|
|
*/
|
|
exports.cpuInfo = function cpuInfo(cb) {
|
|
if(!isFunction(cb)) cb = emptyFn;
|
|
if(!checkPlatform(cb)) return;
|
|
|
|
execFile(wmic, ['cpu', 'get', 'Name'], function (error, res, stderr) {
|
|
if(error !== null || stderr) return cb(error || stderr);
|
|
|
|
var cpus = res.match(/[^\r\n]+/g).map(function(v) {
|
|
return v.trim();
|
|
});
|
|
|
|
cpus.shift();
|
|
cb(null, cpus);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Gets the total memory usage value in KB , MB and GB .
|
|
* @param {function} cb A callback function to handle the result (error, results).
|
|
* @example
|
|
*
|
|
* var cpu = require('windows-cpu');
|
|
*
|
|
* // Get the memory usage
|
|
* cpu.totalMemoryUsage(function(error, results) {
|
|
* if(error) {
|
|
* return console.log(error);
|
|
* }
|
|
*
|
|
* // results =>
|
|
* // {
|
|
* // usageInKb: 3236244,
|
|
* // usageInMb: 3160.39453125,
|
|
* // usageInGb: 3.086322784423828
|
|
* // }
|
|
*
|
|
* console.log('Total Memory Usage: ', result);
|
|
* });
|
|
*/
|
|
exports.totalMemoryUsage = function totalMemoryUsage(cb) {
|
|
if (!isFunction(cb)) cb = emptyFn;
|
|
if (!checkPlatform(cb)) return;
|
|
|
|
var cmd = "tasklist /FO csv /nh";
|
|
exec(cmd, function (error, res, stderr) {
|
|
if(error !== null || stderr) return cb(error || stderr);
|
|
var results = { usageInKb: 0 , usageInMb: 0 , usageInGb: 0 };
|
|
|
|
results.usageInKb = res.match(/[^\r\n]+/g).map(function(v) {
|
|
var amt = +v.split('","')[4].replace(/[^\d]/g, '');
|
|
return (!isNaN(amt) && typeof amt === 'number')? amt : 0;
|
|
}).reduce(function(prev, current) {
|
|
return prev + current;
|
|
});
|
|
|
|
results.usageInMb = results.usageInKb / 1024;
|
|
results.usageInGb = results.usageInMb / 1024;
|
|
|
|
cb(null, results);
|
|
});
|
|
};
|
|
}());
|