pnpm
Version:
Fast, disk space efficient package manager
59 lines (50 loc) • 1.38 kB
JavaScript
;
const path = require('path');
const childProcess = require('child_process');
const tasklist = require('tasklist');
const pify = require('pify');
const TEN_MEGABYTE = 1000 * 1000 * 10;
function win() {
return tasklist().then(data => {
return data.map(x => {
return {
pid: x.pid,
name: x.imageName,
cmd: x.imageName
};
});
});
}
function def(opts) {
opts = opts || {};
const ret = {};
const flags = (opts.all === false ? '' : 'a') + 'wwxo';
return Promise.all(['comm', 'args', '%cpu', '%mem'].map(cmd => {
return pify(childProcess.execFile)('ps', [flags, `pid,${cmd}`], {
maxBuffer: TEN_MEGABYTE
}).then(stdout => {
for (let line of stdout.trim().split('\n').slice(1)) {
line = line.trim();
const pid = line.split(' ', 1)[0];
const val = line.slice(pid.length + 1).trim();
if (ret[pid] === undefined) {
ret[pid] = {};
}
ret[pid][cmd] = val;
}
});
})).then(() => {
// Filter out inconsistencies as there might be race
// issues due to differences in `ps` between the spawns
return Object.keys(ret).filter(x => ret[x].comm && ret[x].args).map(x => {
return {
pid: parseInt(x, 10),
name: path.basename(ret[x].comm),
cmd: ret[x].args,
cpu: ret[x]['%cpu'],
memory: ret[x]['%mem']
};
});
});
}
module.exports = process.platform === 'win32' ? win : def;