Hallo,
@ruhr70:
Habe mit dem Beispiel vom paul53 ein kleins Skript erstellt, welches mit free -m den Arbeitsspeicher unter Ubuntu (deutsch) ausliest
Die Ausgabe von Free muss so aussehen, sonst muss das Skript angepasst werden:
gesamt benutzt frei gemns. Puffer/Cache verfügbar
Speicher: 7966 1238 5916 10 812 6624
Auslagerungsspeicher: 8187 0 8187
Rasbian hat eine englische Ausgabe mit zusätzlichen Werten. Da passt es nicht.
Eine Anpassung ist aber schnell gemacht.
Skript zur Ermittlung des freien Arbeitsspeicher per exec()
! // ermittelt auf Linuxrechner den Speicherverbrauch // mit dem Linux Befehl: free // // Beduetung der Werte: // http://www.selflinux.org/selflinux/html/information_basic02.html ! // getestet unter Ubuntu 16.04 mit deutscher Ausgabe von "free -m" ! // free -m auf der Kosole muss folgende Tabelle ausgeben: ! //# free -m // gesamt benutzt frei gemns. Puffer/Cache verfügbar //Speicher: 7966 1238 5916 10 812 6624 //Auslagerungsspeicher: 8187 0 8187 ! var pfad = "Systeminfos.host.Speicher" + "."; var cronStr = "*/1 * * * *"; ! var forceCreation = false; ! var datenpunkte = { 'Speicher_1_gesamt': { "init":0, "common": { name: 'Speicher gesamt, der für das System verfügbar ist', desc: 'Speicher gesamt, der für das System verfügbar ist (ohne Kernel)', type: 'number', unit: 'MByte', role: 'value' } }, 'Speicher_2_benutzt': { "init":0, "common": { name: 'Speicher benutzt', desc: 'Speicher benutzt', type: 'number', unit: 'MByte', role: 'value' } }, 'Speicher_3_frei': { "init":0, "common": { name: 'Speicher frei', desc: 'Speicher frei', type: 'number', unit: 'MByte', role: 'value' } }, 'Speicher_4_gemeinsam': { "init":0, "common": { name: 'gemeinsamer Speicher für Prozesse', desc: 'gemeinsamer Speicher für Prozesse', type: 'number', unit: 'MByte', role: 'value' } }, 'Speicher_5_Buffer_Cache': { "init":0, "common": { name: 'Speicher als Cache', desc: 'Speicher als Cache', type: 'number', unit: 'MByte', role: 'value' } }, 'Speicher_6_verfügbar': { "init":0, "common": { name: 'verfügbarer Speicher', desc: 'verfügbarer Speicher', type: 'number', unit: 'MByte', role: 'value' } }, 'Auslagerungsspeicher_1_gesamt': { "init":0, "common": { name: 'Auslagerungsspeicher gesamt', desc: 'Auslagerungsspeicher gesamt', type: 'number', unit: 'MByte', role: 'value' } }, 'Auslagerungsspeicher_2_benutzt': { "init":0, "common": { name: 'Auslagerungsspeicher benutzt', desc: 'Auslagerungsspeicher benutzt', type: 'number', unit: 'MByte', role: 'value' } }, 'Auslagerungsspeicher_3_frei': { "init":0, "common": { name: 'Auslagerungsspeicher frei', desc: 'Auslagerungsspeicher frei', type: 'number', unit: 'MByte', role: 'value' } } }; ! function createDp() { var name; var init; var common; for (var dp in datenpunkte) { name = pfad + dp; init = datenpunkte[dp].init; common = datenpunkte[dp].common; createState(name, init , forceCreation, common); } } ! function writeDp(arr) { var i = 0; for (var dp in datenpunkte) { setState(pfad + dp,arr[i++]); } } ! // Speicher mit "free -m" auslesen function freeMem() { exec('free -m', function(err, stdout, stderr) { if (err) { log(err); return; } stdout = stdout.replace(/[\D]+/, ""); // alle Zeichen vor der ersten Ziffer entfernen stdout = stdout.split(/[\D]+/g); // alle nicht-Ziffern als Trennzeichen für das Array verwenden (im Block) //log(stdout); writeDp(stdout); }); } ! // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule(cronStr, freeMem); ! // main // ----------------------------------------------------------------------------- function main() { freeMem(); } ! // Start Skript: // ----------------------------------------------------------------------------- ! createDp(); setTimeout(main, 500); !
Die Werte in den Objekten:
filename="ioBroker_Skript_free.jpg" index="0">~~ `
ich habe auf Basis dieses Skriptes auch ein Skript gebaut, welches mir die CPU Last eines bestimmten Prozesses anzeigt. Es geht um meinen Xeoma Videoserver. Später soll der bei zu hoher Last über längere Zeit auch neu gestartet werden. Hatte das http://forum.iobroker.net/viewtopic.php?f=8&t=2668&p=23698&hilit=xeoma#p23626.
Alter, urpsrünglicher Code (nur für die Referenz, neues Skript weiter unten verfügbar)
! ```
`/* Fragt Load von Xeoma Prozess ab und psiechert pid und load in Objekte
! basierend auf Skript von paul53 und ruhr70
http://forum.iobroker.net/viewtopic.php?f=20&t=2764#p24937
! Startbefehl im Ordner /Appplications: xeoma64bit.app/Contents/MacOS/xeoma -core -log
! # ps -e -o pcpu,pid,args | grep xeoma
58,4 4820 xeoma64bit.app/Contents/MacOS/xeoma -core -log
0,0 4929 grep xeoma
! message_flag verursacht eine Gewisse Hysterese, damit nicht beim erstmaligen Überschreiten des Grenzwertes gleich neugestartet wird.
! erstellt: 02.05.2016 von pix auf Basis von Skripten von ruhr70 und paul53
04.05.2016 kill zugefügt
/
! var grenzwert = 80; // max Leistung in Prozent ohne Konsequenzen
! var pfad = "Xeoma.Prozess" + ".";
var cronStr = "/1 * * * *";
var logging = false;
var idLast = 'javascript.' + instance + '.' + pfad + 'Last';
var idName = 'javascript.' + instance + '.' + pfad + 'Name';
var idPid = 'javascript.' + instance + '.' + pfad + 'pid';
! createState(idLast, {
name: 'Xeoma Last',
desc: 'Prozessorlast, die Xeoma Prozess erzeugt',
type: 'number',
unit: '%'
});
! createState(idPid, {
name: 'Xeoma pid',
desc: 'Prozessnummer des Xeoma Programms',
type: 'number'
});
! createState(idName, {
name: 'Xeoma Name',
desc: 'Name des Prozesses in dem Xeoma läuft',
type: 'string'
});
! function killXeoma() {
var pid = getState(idPid).val,
name = getState(idName).val;
// var kommando = 'kill -HUP ' + pid; geht nicht
var kommando = 'kill -TERM ' + pid + ';cd /Applications;' + name;
if (typeof pid !== undefined) exec(kommando, function(err, stdout, stderr) {
if (err) {
log(err, 'error');
return;
}
});
log('XEOMA Prozess - Neustart wegen zuviel CPU-Last');
}
! // Last mit Befehl "ps -e -o pcpu,pid,args | grep xeoma" auslesen
function loadXeoma() {
exec('ps -e -o pcpu,pid,args | grep xeoma', function(err, stdout, stderr) {
if (err) {
log(err);
return;
}
var zeile = stdout.split(/[\u000A]+/g); // alle Zeilenvorschübe als Trennzeichen für das Array verwenden
zeile = zeile[zeile.length-2]; // nur vorletzte Zeile interessiert
zeile = zeile.replace(/[\D]+/, ""); // alle Zeichen vor der ersten Ziffer entfernen
var element = zeile.split(/[\u0020]+/g); // alle Leerzeichen als Trennzeichen für das Array verwenden
// Last
var last = parseFloat(element[0].replace(",",".")); // Komma durch Punkt ersetzen und in Zahl wandeln
if (logging) log('Last: ' + last);
setState(pfad + 'Last', last);
// PID
var pid = parseInt(element[1], 10);
if (logging) log('PID: ' + pid);
setState(pfad + 'pid', pid);
// Name
var name=''; // alle restlichen Elemente mit ' ' wieder verbinden
for (var i=2; i < element.length; i++) {
name = name + ' ' + element[i];
}
setState(pfad + 'Name', name);
});
}
! var message_flag = 0;
on(idLast, function (data) {
log(message_flag);
if (data.state.val > grenzwert && message_flag < 5) message_flag++;
if (data.state.val > grenzwert && message_flag >= 5) {
log('CPU Last XEOMA, derzeit (' + data.state.val + '%) ist seit ' + message_flag + 'min über dem Grenzwert (' + grenzwert + '%). Maßnahmen ergreifen! pid: ' + getState(idPid).val + ' Name: ' + getState(idName).val);
killXeoma();
}
if (data.state.val < data.oldState.val) message_flag--;
if (message_flag < 0) message_flag = 0;
if (logging) log('Message Flag: ' + message_flag);
});
! schedule(cronStr, loadXeoma);
! function main() {
loadXeoma();
}
! // bei Skriptstart
setTimeout(main,500); Neuestes Skript: ! >! ~~[spoiler]~~[code]/* Fragt Load von Xeoma Prozess ab und psiechert pid und load in Objekte
! basierend auf Skript von paul53 und ruhr70
http://forum.iobroker.net/viewtopic.php?f=20&t=2764#p24937
! Startbefehl im Ordner /Appplications: xeoma64bit.app/Contents/MacOS/xeoma -core -log
! # ps -e -o pcpu,pid,args | grep xeoma
58,4 4820 xeoma64bit.app/Contents/MacOS/xeoma -core -log
0,0 4929 grep xeoma
! message_flag verursacht eine Gewisse Hysterese, damit nicht beim erstmaligen Überschreiten des Grenzwertes gleich neugestartet wird.
! erstellt: 02.05.2016 von pix auf Basis von Skripten von ruhr70 und paul53
04.05.2016 kill zugefügt
05.05.2016 richtigen Prozess mit maximaler Last finden
/
! var grenzwert = 80; // max Leistung in Prozent ohne Konsequenzen
! var pfad = "Xeoma.Prozess" + ".";
var cronStr = "/1 * * * *";
var logging = false;
var idLast = 'javascript.' + instance + '.' + pfad + 'Last';
var idName = 'javascript.' + instance + '.' + pfad + 'Name';
var idPid = 'javascript.' + instance + '.' + pfad + 'pid';
! createState(idLast, {
name: 'Xeoma Last',
desc: 'Prozessorlast, die Xeoma Prozess erzeugt',
type: 'number',
unit: '%'
});
! createState(idPid, {
name: 'Xeoma pid',
desc: 'Prozessnummer des Xeoma Programms',
type: 'number'
});
! createState(idName, {
name: 'Xeoma Name',
desc: 'Name des Prozesses in dem Xeoma läuft',
type: 'string'
});
! function killXeoma() {
var pid = getState(idPid).val,
name = getState(idName).val;
// var kommando = 'kill -HUP ' + pid; geht nicht
var kommando = 'kill -TERM ' + pid + ';cd /Applications;' + name;
if (typeof pid !== undefined) exec(kommando, function(err, stdout, stderr) {
if (err) {
log(err, 'error');
return;
}
});
log('XEOMA Prozess - Neustart wegen zuviel CPU-Last');
}
! function findeZeile(array) { // array aus zeilen
var zeilemax = 0;
var teillastmax = 0;
var reihe;
var spalte;
var spalte_last;
for (var j = 0; j < array.length; j++) {
//if (logging) log('Zeile: ' + j + ' von ' + array.length);
reihe = array[j].replace(/[\D]+/, ""); // alle Zeichen vor der ersten Ziffer entfernen
spalte_array = reihe.split(/[\u0020]+/g); // alle Leerzeichen als Trennzeichen für das Array verwenden
//if (logging) log('Teile: '+ spalte_array);
spalte_last = parseFloat(spalte_array[0].replace(",",".")); // Komma durch Punkt ersetzen und in Zahl wandeln
//if (logging) log('Teillast: '+ spalte_last);
if (spalte_last > teillastmax) {
teillastmax = spalte_last;
zeilemax = j;
}
}
return (zeilemax);
}
! // Last mit Befehl "ps -e -o pcpu,pid,args | grep xeoma" auslesen
function loadXeoma() {
exec('ps -e -o pcpu,pid,args | grep xeoma', function(err, stdout, stderr) {
if (err) {
log(err);
return;
} else if (logging) log(stdout);
var zeilen_array = stdout.split(/[\u000A]+/g); // alle Zeilenvorschübe als Trennzeichen für das Array verwenden
var zeile = zeilen_array[findeZeile(zeilen_array)];
// ab hier gehts nur um die zeile
zeile = zeile.replace(/[\D]+/, ""); // alle Zeichen vor der ersten Ziffer entfernen
var element = zeile.split(/[\u0020]+/g); // alle Leerzeichen als Trennzeichen für das Array verwenden
// Last
var last = parseFloat(element[0].replace(",",".")); // Komma durch Punkt ersetzen und in Zahl wandeln
setState(pfad + 'Last', last);
// PID
var pid = parseInt(element[1], 10);
setState(pfad + 'pid', pid);
// Name
var name=''; // alle restlichen Elemente mit ' ' wieder verbinden
for (var i=2; i < element.length; i++) {
name = name + ' ' + element[i];
}
if (logging) log('PID: ' + pid + ' Last: ' + last + '% Name: ' + name);
setState(pfad + 'Name', name);
});
}
! var message_flag = 0;
on(idLast, function (data) {
if (data.state.val > grenzwert && message_flag < 5) message_flag++;
if (data.state.val > grenzwert && message_flag >= 5) {
log('CPU Last XEOMA, derzeit (' + data.state.val + '%) ist seit ' + message_flag + 'min über dem Grenzwert (' + grenzwert + '%). Maßnahmen ergreifen! pid: ' + getState(idPid).val + ' Name: ' + getState(idName).val);
killXeoma();
}
if (data.state.val < data.oldState.val) message_flag--;
if (message_flag < 0) message_flag = 0;
if (logging) log('Message Flag: ' + message_flag);
});
! schedule(cronStr, loadXeoma);
! function main() {
loadXeoma();
}
! // bei Skriptstart
setTimeout(main,500);`
Allerdings kam ich bzw. meine ioBroker Installation mit den Funktionen zum Anlegen der Datenpunkte nicht zurecht. Das war ein richtiges Durcheinander. Deshalb lege ich die DP lieber weiter von Hand mit createState an. Dennoch vielen Dank an paul53 und ruhr70.
! Es werden drei DP angelegt mir dem minütlichen Update der Last, der ProzessID und dem Namen, bzw. Aufruf des Prozesses (brauche ich später für evetuell für Neustart, wenn <size size="85">~~[size]~~kill -HUP pid[/size]</size> nicht funktioniert).
! Gruß
! Pix
! EDIT 04.05.2016 - 1720 Uhr kill zugefügt
! EDIT 05.05.2016 - 1335 Uhr es wird nun nach der Zeile mit der max Last gesucht, nicht immer die vorletzte Zeile verwendet.[/i][/code][/spoiler][/i]