var pfad = "Systeminfos.ioBroker.Prozesse" + "."; // Pfad in dem die Datenpunkte angelegt werden
// Datenpunktnamen:
var idProzesse = pfad + 'ioBroker_Prozesse';
var idMemAll = pfad + 'ioBroker_Speicher_gesamt';
var idAnzProzesse = pfad + 'ioBroker_Anzahl_Prozesse';
var idCpuAll = pfad + 'ioBroker_CPU_Gesamt';
var idMemPercent = pfad + 'ioBroker_Speicher_prozentual';
var idInstanzenEinmal = pfad + 'ioBroker_Instanzen_einmal_aktiv';
// regelmässige Wiederholungen der Abfrage
var cronStr = "*/2 * * * *";
var abfrage = 'ps -A aux --sort -pcpu | grep " [i]o.*"';
// -----------------------------------------------------------------------------
createState(idProzesse, "", {
name: 'ioBroker laufende Prozesse Objekt',
desc: 'ioBroker laufende Prozesse Objekt, Speicherverbrauch',
type: 'string',
unit: '',
role: 'object'
});
createState(idMemAll, 0, {
name: 'ioBroker Speicherverbrauch gesamt',
desc: 'ioBroker Speicherverbrauch gesamt (RSS)',
type: 'number',
unit: 'MB',
role: 'value'
});
createState(idAnzProzesse, 0, {
name: 'ioBroker Anzahl Prozesse',
desc: 'ioBroker Anzahl aktiver Prozesse',
type: 'number',
unit: '',
role: 'value'
});
createState(idCpuAll, 0.0, {
name: 'ioBroker CPU-Last gesamt',
desc: 'ioBroker CPU-Last gesamt',
type: 'number',
unit: '%',
role: 'value'
});
createState(idMemPercent, 0.0, {
name: 'Speicherverbrauch prozentual',
desc: 'Speicherverbrauch prozentual',
type: 'number',
unit: '%',
role: 'value'
});
createState(idInstanzenEinmal, true, {
name: 'keine Instanzen doppelt aktiv',
desc: 'jeder aktive ioBroker Prozess ist nur einmal aktiv',
type: 'boolean',
unit: '',
role: 'value'
});
// -----------------------------------------------------------------------------
function doppelteProzesse(arr) {
var mehrfacheProzesse = [];
var anzProzesse = (arr.length);
var anzProzessAktiv = 0;
for (var i = 0; i < anzProzesse; i++) {
if (mehrfacheProzesse.indexOf(arr[i].command) == -1) {
anzProzessAktiv = zaehleProzesse(arr,arr[i].command);
if (anzProzessAktiv > 1) {
log("Prozess: " + arr[i].command+", mehrfach aktiv: " + anzProzessAktiv +" mal","warn");
mehrfacheProzesse.push(arr[i].command);
mehrfacheProzesse.push(anzProzessAktiv);
}
}
}
return mehrfacheProzesse;
}
function zaehleProzesse(arr,command) {
var count = 0;
var anzProzesse = (arr.length);
for (var i = 0; i < anzProzesse; i++) {
if(arr[i].command === command) {
count++;
}
}
return count;
}
function writeJson(json) {
return JSON.stringify(json); // JSON in String umwandeln, damit das JSON in einem Datenpunkt geschrieben werden kann
}
function getMemAbsolut(json) {
var anzProzesse = (json.length);
var mem = 0;
for (var i = 0; i < anzProzesse; i++) {
mem = mem + json[i].rss;
}
return mem;
}
function getCpu(json) {
var anzProzesse = (json.length);
var cpu = 0.0;
for (var i = 0; i < anzProzesse; i++) {
cpu = cpu + json[i].cpu;
}
return cpu;
}
function getMem(json) {
var anzProzesse = (json.length);
var mem = 0.0;
for (var i = 0; i < anzProzesse; i++) {
mem = mem + json[i].mem;
}
return mem;
}
function createArrayJson(arr) {
var jsonArr = [];
var anzDP = 11; // Anzahl Datenreihen in der Abfrage
var anzProzesse = (arr.length-1)/anzDP;
for (var i = 0; i < anzProzesse; i++) {
jsonArr.push({
command: arr[10 + i*anzDP], // ioBroker Prozess (COMMAND = Kommando, mit dem der Prozess gestartet wurde)
pid: arr[ 1 + i*anzDP], // Prozess ID
cpu: parseFloat(arr[ 2 + i*anzDP]), // aktueller CPU-Last in %
mem: parseFloat(arr[ 3 + i*anzDP]), // aktueller Verbrauch physikalischer Speicher %
vmem: parseInt(arr[ 4 + i*anzDP]), //
rss: parseInt(arr[ 5 + i*anzDP]), // physikalische Speichernutzung
start: arr[ 8 + i*anzDP], // Startzeitpunkt des Prozesses
time: arr[ 9 + i*anzDP] // bisher verbrauchte CPU Zeit
});
}
return jsonArr;
}
function abfrageConsole() {
exec(abfrage, function(err, stdout, stderr) {
if (err) {
log(err,"error");
return;
}
stdout = stdout.replace(/\n+/g, " "); // neue Zeile gegen Leerzeichen ersetzen
stdout = stdout.split(/ +/g); // array erstellen, Lerzeichen als Trenner
var anzProzesse = (stdout.length-1) / 11;
//log(stdout);
//log("Anzahl laufender ioBroker Prozesse: " + anzProzesse);
var jsonArr = createArrayJson(stdout);
var mem = Math.floor(getMemAbsolut(jsonArr)/1024);
var cpu = Math.floor(getCpu(jsonArr)*10)/10;
var memPercent = Math.floor(getMem(jsonArr)*10)/10;
var doppeltArr = doppelteProzesse(jsonArr);
if(doppeltArr.length === 0) {
setState(idInstanzenEinmal,true);
} else {
setState(idInstanzenEinmal,false);
}
setState(idProzesse ,writeJson(jsonArr));
setState(idMemAll ,mem);
setState(idAnzProzesse ,anzProzesse);
setState(idCpuAll ,cpu);
setState(idMemPercent ,memPercent);
});
}
function abfragen() {
abfrageConsole();
}
// regelmässige Wiederholungen
// -----------------------------------------------------------------------------
schedule(cronStr, abfragen);
// main
// -----------------------------------------------------------------------------
function main() {
abfragen();
}
// Start Skript:
// -----------------------------------------------------------------------------
setTimeout(main, 500);