added process list

This commit is contained in:
Sebastian Hildebrandt 2016-08-24 12:12:18 +02:00
parent c3cc3235f8
commit 9feb6c28aa
2 changed files with 124 additions and 40 deletions

View File

@ -40,11 +40,12 @@ si.cpu()
### Latest Activity ### Latest Activity
- Version 3.3.0: added process list. Get full process list including details like cpu and mem usage, status, command, ...
- Version 3.2.0: added battery support. If a battery is installed, you get information about status and current capacity level - Version 3.2.0: added battery support. If a battery is installed, you get information about status and current capacity level
- Version 3.1.0: added [Docker][docker-url] support. Now you can scan your docker containers and get their stats - Version 3.1.0: added [Docker][docker-url] support. Now you can scan your docker containers and get their stats
- Version 3.0.0: added DisksIO - overall diskIO and IOPS values for all mounted volumes - Version 3.0.0: added DisksIO - overall diskIO and IOPS values for all mounted volumes
I also created a little CLI-Tool called [mmon][mmon-github-url] (micro-monitor), also available via [github][mmon-github-url] and [npm][mmon-npm-url] I also created a little command line tool called [mmon][mmon-github-url] (micro-monitor), also available via [github][mmon-github-url] and [npm][mmon-npm-url]
Here all changes more detailed: Here all changes more detailed:
@ -64,6 +65,7 @@ Here all changes more detailed:
New Functions New Functions
- `processes`: now returns also a process list with all process details (new in version 3.3)
- `battery`: retrieves battery status and charging level (new in version 3.2) - `battery`: retrieves battery status and charging level (new in version 3.2)
- `dockerContainers`: returns a list of all docker containers (new in version 3.1) - `dockerContainers`: returns a list of all docker containers (new in version 3.1)
- `dockerContainerStats`: returns statistics for a specific docker container (new in version 3.1) - `dockerContainerStats`: returns statistics for a specific docker container (new in version 3.1)
@ -264,6 +266,8 @@ This library is splitted in several sections:
| - all | X | X | # of all processes | | - all | X | X | # of all processes |
| - running | X | X | # of all processes running | | - running | X | X | # of all processes running |
| - blocked | X | X | # of all processes blocked | | - blocked | X | X | # of all processes blocked |
| - sleeping | X | X | # of all processes sleeping |
| - list | X | X | # list of all processes incl. details |
| si.processLoad('apache2',cb) | X | X | detailed information about given process | | si.processLoad('apache2',cb) | X | X | detailed information about given process |
| - proc | X | X | process name | | - proc | X | X | process name |
| - pid | X | X | PID | | - pid | X | X | PID |
@ -365,6 +369,7 @@ I am happy to discuss any comments and suggestions. Please feel free to contact
| Version | Date | Comment | | Version | Date | Comment |
| -------------- | -------------- | -------- | | -------------- | -------------- | -------- |
| 3.3.0 | 2016-08-24 | process list added to processes |
| 3.2.1 | 2016-08-19 | updated docs, improvement system | | 3.2.1 | 2016-08-19 | updated docs, improvement system |
| 3.2.0 | 2016-08-19 | added battery information | | 3.2.0 | 2016-08-19 | added battery information |
| 3.1.1 | 2016-08-18 | improved system and os detection (vm, ...), bugfix disksIO | | 3.1.1 | 2016-08-18 | improved system and os detection (vm, ...), bugfix disksIO |
@ -416,7 +421,7 @@ Written by Sebastian Hildebrandt [sebhildebrandt](https://github.com/sebhildebra
Linux is a registered trademark of Linus Torvalds, OS X is a registered trademark of Apple Inc., Linux is a registered trademark of Linus Torvalds, OS X is a registered trademark of Apple Inc.,
Windows is a registered trademark of Microsoft Corporation. Node.js is a trademark of Joyent Inc., Windows is a registered trademark of Microsoft Corporation. Node.js is a trademark of Joyent Inc.,
Intel is a trademark of Intel Corporation, Raspberry Pi is a trademark of the Raspberry Pi Foundation, Intel is a trademark of Intel Corporation, Raspberry Pi is a trademark of the Raspberry Pi Foundation,
Debian is a trademark of the Debian Project, Ubuntu is a trademark of Canonical Ltd. Debian is a trademark of the Debian Project, Ubuntu is a trademark of Canonical Ltd., Docker is a trademarks of Docker, Inc.
All other trademarks are the property of their respective owners. All other trademarks are the property of their respective owners.
## License [![MIT license][license-img]][license-url] ## License [![MIT license][license-img]][license-url]

View File

@ -80,9 +80,10 @@
// -------------------------------- // --------------------------------
// //
// version date comment // version date comment
// 3.3.0 2016-08-24 added process list
// 3.2.1 2016-08-20 updated docs, improvement system // 3.2.1 2016-08-20 updated docs, improvement system
// 3.2.0 2016-08-19 added battery info // 3.2.0 2016-08-19 added battery info
// 3.1.1 2016-08-18 improved system and os detection (vm, ...), bugfix disksIO // 3.1.1 2016-08-18 improved system and os detection (vm, ...), bug fix disksIO
// 3.1.0 2016-08-18 added docker stats // 3.1.0 2016-08-18 added docker stats
// 3.0.1 2016-08-17 Bug-Fix disksIO, users, updated docs // 3.0.1 2016-08-17 Bug-Fix disksIO, users, updated docs
// 3.0.0 2016-08-03 new major version 3.0 // 3.0.0 2016-08-03 new major version 3.0
@ -855,7 +856,7 @@ function battery(callback) {
if (_darwin) { if (_darwin) {
exec("ioreg -n AppleSmartBattery -r | grep '\"CycleCount\"';ioreg -n AppleSmartBattery -r | grep '\"IsCharging\"';ioreg -n AppleSmartBattery -r | grep '\"MaxCapacity\"';ioreg -n AppleSmartBattery -r | grep '\"CurrentCapacity\"'", function (error, stdout) { exec("ioreg -n AppleSmartBattery -r | grep '\"CycleCount\"';ioreg -n AppleSmartBattery -r | grep '\"IsCharging\"';ioreg -n AppleSmartBattery -r | grep '\"MaxCapacity\"';ioreg -n AppleSmartBattery -r | grep '\"CurrentCapacity\"'", function (error, stdout) {
if (!error) { if (!error) {
let lines = stdout.toString().replace(/ +/g, "").replace(/\"+/g, "").split('\n'); let lines = stdout.toString().replace(/ +/g, "").replace(/"+/g, "").split('\n');
lines.forEach(function (line) { lines.forEach(function (line) {
if (line.indexOf('=') != -1) { if (line.indexOf('=') != -1) {
if (line.toLowerCase().indexOf('cyclecount') != -1) result.cyclecount = parseFloat(line.split('=')[1].trim()); if (line.toLowerCase().indexOf('cyclecount') != -1) result.cyclecount = parseFloat(line.split('=')[1].trim());
@ -1667,6 +1668,98 @@ exports.services = services;
function processes(callback) { function processes(callback) {
let parsedhead = [];
function parseHead(head, rights) {
let space = (rights > 0);
let count = 1;
let from = 0;
let to = 0;
let result = [];
for (let i = 0; i < head.length; i++) {
if (count <= rights) {
if (head[i] == ' ' && !space) {
to = i - 1;
result.push({
from: from,
to: to+1,
cap: head.substring(from, to+1)
});
from = to + 2;
count++;
}
space = head[i] == ' ';
} else {
if (head[i] != ' ' && space) {
to = i - 1;
if (from < to) {
result.push({
from: from,
to: to,
cap: head.substring(from, to)
});
}
from = to + 1;
count++;
}
space = head[i] == ' ';
}
}
to = 1000;
result.push({
from: from,
to: to,
cap: head.substring(from, to)
});
return result;
}
function parseLine(line) {
let pid = parseInt(line.substring(parsedhead[0].from,parsedhead[0].to));
let pcpu = parseFloat(line.substring(parsedhead[1].from,parsedhead[1].to).replace(/,/g, "."));
let pmem = parseFloat(line.substring(parsedhead[2].from,parsedhead[2].to).replace(/,/g, "."));
let priority = parseInt(line.substring(parsedhead[3].from,parsedhead[3].to));
let vsz = parseInt(line.substring(parsedhead[4].from,parsedhead[4].to));
let rss = parseInt(line.substring(parsedhead[5].from,parsedhead[5].to));
let started = line.substring(parsedhead[6].from,parsedhead[6].to).trim();
let state = line.substring(parsedhead[7].from,parsedhead[7].to).trim();
state = (state[0] == 'R' ? 'running': (state[0] == 'S' ? 'sleeping': (state[0] == 'T' ? 'stopped': (state[0] == 'W' ? 'paging': (state[0] == 'X' ? 'dead': (state[0] == 'Z' ? 'zombie': ((state[0] == 'D' || state[0] == 'U') ? 'blocked': 'unknown')))))));
let tty = line.substring(parsedhead[8].from,parsedhead[8].to).trim();
if (tty == '?' || tty == '??') tty = '';
let user = line.substring(parsedhead[9].from,parsedhead[9].to).trim();
let command = line.substring(parsedhead[10].from,parsedhead[10].to).trim().replace(/\[/g, "").replace(/]/g, "");
return ({
pid: pid,
pcpu: pcpu,
pmem: pmem,
priority: priority,
mem_vsz: vsz,
mem_rss: rss,
started: started,
state: state,
tty: tty,
user: user,
command: command
})
}
function parseProcesses(lines) {
let result = [];
if (lines.length > 1) {
let head = lines[0];
parsedhead = parseHead(head, 7);
lines.shift();
lines.forEach(function (line) {
if (line.trim() != '') {
result.push(parseLine(line));
}
});
}
return result;
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
process.nextTick(() => { process.nextTick(() => {
if (_windows) { if (_windows) {
@ -1674,47 +1767,33 @@ function processes(callback) {
if (callback) { callback(NOT_SUPPORTED) } if (callback) { callback(NOT_SUPPORTED) }
reject(error); reject(error);
} }
let result = {
var result = {
all: 0, all: 0,
running: 0, running: 0,
blocked: 0 blocked: 0,
sleeping: 0,
list: []
}; };
exec("ps aux | grep -v 'ps aux' | wc -l", function (error, stdout) {
let cmd = "";
if (_linux) cmd = "ps axo pid:10,pcpu:6,pmem:6,pri:5,vsz:10,rss:10,start:20,state:20,tty:20,user:20,command --sort=-pcpu";
if (_darwin) cmd = "ps acxo pid,pcpu,pmem,pri,vsz,rss,start,state,tty,user,command -r";
exec(cmd, function (error, stdout) {
if (!error) { if (!error) {
result.all = parseInt(stdout.toString()); result.list = parseProcesses(stdout.toString().split('\n'));
if (_darwin) { result.all = result.list.length;
exec("ps axo state | grep 'R' | wc -l; ps axo state | grep 'U' | wc -l", function (error, stdout) { result.running = result.list.filter(function (e) {
if (!error) { return e.state == 'running'
let lines = stdout.toString().split('\n'); }).length;
result.running = parseInt(lines[0]); result.blocked = result.list.filter(function (e) {
result.blocked = parseInt(lines[1]); return e.state == 'blocked'
} }).length;
if (callback) { callback(result) } result.sleeping = result.list.filter(function (e) {
resolve(result); return e.state == 'sleeping'
}) }).length
}
if (_linux) {
exec("cat /proc/stat | grep procs_", function (error, stdout) {
if (!error) {
let lines = stdout.toString().split('\n');
lines.forEach(function (line) {
if (line.toUpperCase().indexOf('PROCS_RUNNING') != -1) {
result.running = parseInt(line.replace(/ +/g, " ").split(' ')[1]);
}
if (line.toUpperCase().indexOf('PROCS_BLOCKED') != -1) {
result.blocked = parseInt(line.replace(/ +/g, " ").split(' ')[1]);
}
})
}
if (callback) { callback(result) }
resolve(result);
})
}
} else {
if (callback) { callback(result) }
resolve(result);
} }
if (callback) { callback(result) }
resolve(result);
}); });
}); });
}); });