pidusage
Version:
Cross-platform process cpu % and memory usage of a PID — Edit
80 lines (62 loc) • 1.84 kB
JavaScript
var spawn = require('child_process').spawn
var os = require('os')
var PLATFORM = os.platform()
/**
* Get pid informations through ps command
* @param {Number|Number[]} pid
* @param {Object} options
* @return {Function} callback(err, stat)
* on os x skip headers with pcpu=,rss=
* on linux it could be --no-header
* on solaris 11 can't figure out a way to do this properly so...
*/
function ps (pid, options, done) {
if (Array.isArray(pid)) {
pid = pid.join(',')
}
var args = ['-o', 'pcpu,rss,pid,time', '-p', pid]
if (PLATFORM === 'aix') {
args = ['-o', 'pcpu,rsssize,pid,time', '-p', pid]
}
var ps = spawn('ps', args)
var error
var stdout
ps.on('error', function (err) {
error = err
})
ps.stdout.on('data', function (d) {
stdout += d.toString()
})
ps.on('close', function () {
var date = Date.now()
if (error) return done(error, null)
stdout = stdout.split(os.EOL)
var statistics = []
for (var i = 1; i < stdout.length; i++) {
stdout[i] = stdout[i].trim()
if (!stdout[i]) {
continue
}
var line = stdout[i].replace(/^\s+/, '').replace(/\s\s+/g, ' ').split(' ')
var time = 0
// Example output 7-22:43:36
var tmp = line[3].split(':')
var days = 0
if (~tmp[0].indexOf('-')) {
var daysAndHours = tmp[0].split('-')
tmp[0] = daysAndHours[1]
days = daysAndHours[0]
}
time = (days * 86400 + tmp[0] * 3600 + tmp[1] * 60 + tmp[2]) * 1000
statistics[i - 1] = {
cpu: parseFloat(line[0].replace(',', '.')),
memory: parseFloat(line[1]) * 1024,
pid: parseInt(line[2], 0),
time: time, // time in ms
start: new Date(date - time)
}
}
done(null, statistics)
})
}
module.exports = ps