Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Adapter mit Shell/execute am Serververzeichnis

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    10
    1
    65

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    554

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

Adapter mit Shell/execute am Serververzeichnis

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
8 Beiträge 5 Kommentatoren 6.7k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • N Offline
    N Offline
    Nathanael
    schrieb am zuletzt editiert von
    #1

    Hallo,

    für ein paar Routineaufgaben, die ich bin den iobroker importieren und den iobroker.vis als Dashboard möchte, muss ich einen Zugang zu Shell-Scripten erwirken.

    Gibt es bereits eine Funktion, mit der ich dies tatsächlich am Server direkt ausführen kann? Ähnlich dem php shell_exec?

    Teil2:

    aus Dateien am Server sollen logwerte als Variable in den iobroker übertragen werden. Hat dazu jemand einen Rat?

    Vielen Dank

    Nathanael

    1 Antwort Letzte Antwort
    0
    • P Offline
      P Offline
      pix
      schrieb am zuletzt editiert von
      #2

      @Nathanael:

      Gibt es bereits eine Funktion, mit der ich dies tatsächlich am Server direkt ausführen kann? Ähnlich dem php shell_exec? `
      Ja, EXEC - Befehl –> https://github.com/ioBroker/ioBroker.ja ... ile1-file2

      Gruß

      Pix

      ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

      1 Antwort Letzte Antwort
      0
      • paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #3

        Da die Beschreibung von exec(cmd, callback) in der JS-Adapter Doku recht kurz ist, http://forum.iobroker.de/viewtopic.php?f=21&t=2643&p=23266&sid=35fea490cb92e80ea7a2702f6be53bdd&sid=35fea490cb92e80ea7a2702f6be53bdd#p23266 ein Beispiel, wie man es anwendet.

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Antwort Letzte Antwort
        0
        • N Offline
          N Offline
          Nathanael
          schrieb am zuletzt editiert von
          #4

          Vielen dank für die Hinweise.

          Den ioBroker habe ich jetzt erstmal komplett neu aufgesetzt, habe aber jetzt ein paar kleine Hindernisse mit dem Javascript:

          Das execute wollte ich in mein Script verwenden und den Fehler mittels log(err) darstellen. Leider bekomme ich keinen Fehler, auch wenn das Script nicht funktionieren kann. Es macht sogar passend dazu nichts. :-)

          Gibt es eine Idee, ob man dazu nachsehen kann, ob tatsächlich nichts passiert/warum es nichts macht?

          Gibt es ein Testscript?

          Javascript-Adapter ist 2.0.6

          Nathanael

          1 Antwort Letzte Antwort
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            schrieb am zuletzt editiert von
            #5

            @Nathanael:

            Vielen dank für die Hinweise.

            Den ioBroker habe ich jetzt erstmal komplett neu aufgesetzt, habe aber jetzt ein paar kleine Hindernisse mit dem Javascript:

            Das execute wollte ich in mein Script verwenden und den Fehler mittels log(err) darstellen. Leider bekomme ich keinen Fehler, auch wenn das Script nicht funktionieren kann. Es macht sogar passend dazu nichts. :-)

            Gibt es eine Idee, ob man dazu nachsehen kann, ob tatsächlich nichts passiert/warum es nichts macht?

            Gibt es ein Testscript?

            Javascript-Adapter ist 2.0.6

            Nathanael `
            Sehr oft vergisst man JS Adapter zu starten oder Skript zu aktivieren.

            Sonst, wie sieht Skript aus?

            1 Antwort Letzte Antwort
            0
            • ruhr70R Offline
              ruhr70R Offline
              ruhr70
              schrieb am zuletzt editiert von
              #6

              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:

              327_iobroker_skript_free.jpg

              Adapter: Fritzbox, Unify Circuit
              Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

              1 Antwort Letzte Antwort
              0
              • N Offline
                N Offline
                Nathanael
                schrieb am zuletzt editiert von
                #7

                Vielen Dank für Eure Hilfen.

                Den iobroker und den javascript-Adapter musste ich dann erstmal neu installieren… Naja, was solls.

                Hier ist der Code meines Erzeugnisses, eine Einbindung des Worx Landroid Rasenroboters mit WLAN in den iobroker. Es werden noch mehrere Funktionen hinzukommen, als nächstes die Implementierung der Worktime und Start/Stop.

                Leider muss ich auf "cURL" zurückgreifen, wenn es auch direkt im Javascript geht, wäre dies super.

                //Rasenmäher Script
                
                var landroidIP = "http://192.168.178.42";
                var weeklyruntime  = "1440"; //Minutes of cutting grass e.g. 800m² require 24h cutting means 1440Minutes
                var cronremoveweek = "59 23 * * 6";
                var pfad            = "Mower" + ".";
                var cronStr         = "*/1 * * * *";
                
                var forceCreation   = false;
                var datenpunkte = {
                    'State': {"init":0, "common": {name: 'Mow_State'}},
                    'Charger_State': {"init":0, "common": {name: 'Mow_CHGstate'}},
                    'Acceleration': {"init":0, "common": {name: 'Mow_Movement'}},
                    'Battery_State': {"init":0, "common": {name: 'Mow_Battery'}},
                    'RainSensor': {"init":0, "common": {name: 'Mow_Rain'}},
                    'Worktimethisweek': {"init":0, "common": {name: 'Mow_this_week'}},
                    'Workpercent': {"init":0, "common": {name: 'Mow_this_week_percent'}},
                };
                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 mowerstates() {
                    exec('curl -s --user admin:0000 -L ' + landroidIP + '/jsonDebug.cgi', function(err, stdout, stderr) {
                        if (err) {
                            log(err);
                            return;
                        }
                        //log(stdout);
                        str = stdout;
                        str = stdout.substring(stdout.indexOf("{\"landroid\":{\"state\":") + 22);
                        str = str.substring(0, str.indexOf(",") -1);
                        setState(pfad + "State",str);
                        str = stdout.substring(stdout.indexOf("\"batteryCharger\":{\"state\":") + 27);
                        str = str.substring(0, str.indexOf(",") -1);
                        setState(pfad + "Charger_State",str);
                        str = stdout.substring(stdout.indexOf("rainSensor") + 12);
                        str = str.substring(0, str.indexOf(","));
                        if (str < 3000)
                        { str = "Rain detected"} 
                        else
                        {str = "Not raining"}
                        setState(pfad + "RainSensor",str);
                        str = stdout.substring(stdout.indexOf(":{\"gravity") + 13);
                        str = str.substring(0, str.indexOf("]"));
                        coor = str.split(",");
                        setState(pfad + "Acceleration",coor[0] + "," + coor[1]);
                        str = stdout.substring(stdout.indexOf("\"battery\":{\"percentage\":") + 24);
                        str = str.substring(0, str.indexOf(","));
                        setState(pfad + "Battery_State",str);
                    });
                }
                
                function mowpercent() {
                    setState(pfad + "Worktimethisweek","0");
                    setState(pfad + "Workpercent","0");
                }
                
                // regelmässige Wiederholungen
                // -----------------------------------------------------------------------------
                schedule(cronStr, mowerstates);
                schedule(cronremoveweek, mowpercent);
                
                // main
                // -----------------------------------------------------------------------------
                function main() {
                    mowerstates();
                }
                
                // Start Skript:
                // -----------------------------------------------------------------------------
                
                createDp();
                setTimeout(main,    500);
                

                Gruß

                Nathanael

                1 Antwort Letzte Antwort
                0
                • P Offline
                  P Offline
                  pix
                  schrieb am zuletzt editiert von
                  #8

                  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]

                  ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                  1 Antwort Letzte Antwort
                  0
                  Antworten
                  • In einem neuen Thema antworten
                  Anmelden zum Antworten
                  • Älteste zuerst
                  • Neuste zuerst
                  • Meiste Stimmen


                  Support us

                  ioBroker
                  Community Adapters
                  Donate
                  FAQ Cloud / IOT
                  HowTo: Node.js-Update
                  HowTo: Backup/Restore
                  Downloads
                  BLOG

                  666

                  Online

                  32.5k

                  Benutzer

                  81.8k

                  Themen

                  1.3m

                  Beiträge
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                  ioBroker Community 2014-2025
                  logo
                  • Anmelden

                  • Du hast noch kein Konto? Registrieren

                  • Anmelden oder registrieren, um zu suchen
                  • Erster Beitrag
                    Letzter Beitrag
                  0
                  • Home
                  • Aktuell
                  • Tags
                  • Ungelesen 0
                  • Kategorien
                  • Unreplied
                  • Beliebt
                  • GitHub
                  • Docu
                  • Hilfe