Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Beispiel alle ioBroker Prozesse / Speicherverbrauch

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Beispiel alle ioBroker Prozesse / Speicherverbrauch

    This topic has been deleted. Only users with topic management privileges can see it.
    • ruhr70
      ruhr70 last edited by

      Ein Beispielskript um an einem Linux-Rechner alle laufenden ioBroker Prozesse und den dazugehörigen Speicherverbrauch abzufragen.

      Das Skript erzeugt ein JSON mit allen laufenden ioBroker Prozessen und legt diesen in einem Datenpunkt ab.

      Visualisierung in VIS:

      327_iobroker_prozesse.jpg

      Anhand des JSON können einige weitere Informationen gewonnen werden, wie z.B.:

      • Anzahl ioBroker Prozesse

      • Gesamtspeicherverbrauch ioBroker (Summe RSS aller Prozesse)

      • …

      Das Skript:

      ! ```
      `var pfad = "Systeminfos.ioBroker" + "."; // Pfad in dem die Datenpunkte angelegt werden
      ! // Datenpunktnamen:
      var idProzesse = pfad + 'ioBroker_Prozesse';
      ! // regelmässige Wiederholungen der Abfrage
      var cronStr = "/10 * * * ";
      ! var abfrage = 'ps -A aux --sort -pmem | grep " [i]o.
      "';
      ! createState(idProzesse, "", {
      name: 'ioBroker laufende Prozesse',
      desc: 'ioBroker laufende Prozesse, Speicherverbrauch',
      type: 'string',
      unit: '',
      role: 'object'
      });
      ! function writeJson(json) {
      return JSON.stringify(json); // JSON in String umwandeln, damit das JSON in einem Datenpunkt geschrieben werden kann
      }
      !
      ! 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 + ianzDP], // Prozess ID
      cpu: arr[ 2 + i
      anzDP], // aktueller CPU-Last in %
      vmem: arr[ 4 + ianzDP], //
      rss: arr[ 5 + i
      anzDP], // physikalische Speichernutzung
      start: arr[ 8 + ianzDP], // 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);
      

      ! setState(idProzesse,writeJson(jsonArr));
      });
      }
      ! function abfragen() {
      abfrageConsole();
      }
      ! // regelmässige Wiederholungen
      // -----------------------------------------------------------------------------
      schedule(cronStr, abfragen);
      ! // main
      // -----------------------------------------------------------------------------
      function main() {
      abfragen();
      }
      ! // Start Skript:
      // -----------------------------------------------------------------------------
      ! setTimeout(main, 500);`
      ! [EDIT]
      ! Es gibt eine neue Version des Skripts (Version 2):
      ! http://forum.iobroker.net/viewtopic.php ... 935#p26547
      ! Version 3:
      ! http://forum.iobroker.net/viewtopic.php ... 698#p26698[/i]

      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Der Hammer! Danke

        Gesendet mit Tapatalk

        1 Reply Last reply Reply Quote 0
        • eric2905
          eric2905 last edited by

          Klasse!

          1 Reply Last reply Reply Quote 0
          • L
            looxer01 last edited by

            Hi Ruhr,

            super - vielen Dank

            wenn ich das richtig sehe, dann verwendest du das Widget "json table"

            Das habe ich auch versucht, allerdings schaffe ich es nicht die Spaltenbreiten zu definieren.

            Ergebnis ist, dass die ersten Spalten zu schmal sind und die letzten zu breit. Width scheint nicht mit Px-Angaben zu funktionieren.

            Wie hast du die Einstellungen vorgenommen ?

            vG Looxer

            1 Reply Last reply Reply Quote 0
            • ruhr70
              ruhr70 last edited by

              @looxer01:

              Hi Ruhr,

              super - vielen Dank

              wenn ich das richtig sehe, dann verwendest du das Widget "json table"

              Das habe ich auch versucht, allerdings schaffe ich es nicht die Spaltenbreiten zu definieren.

              Ergebnis ist, dass die ersten Spalten zu schmal sind und die letzten zu breit. Width scheint nicht mit Px-Angaben zu funktionieren.

              Wie hast du die Einstellungen vorgenommen ?

              vG Looxer `

              Doch, ich habe einfach die Pixel unter Width eingetragen (unter Headers[0], Headers[1], …).

              Du kannst auch einstellen, wieviele und welche Spalten angezeigt werden

              1 Reply Last reply Reply Quote 0
              • ruhr70
                ruhr70 last edited by

                Neue Version des Skripts:

                • zusätzliche Parameter im JSON (CPU-Last, Speicher Prozentual)

                Zusätzliche Datenpunkte werden angelegt:

                • Datenpunkt: Anzahl Prozesse ist hinzugekommen

                • Datenpunkt: Speicherverbrauch ioBroker physikalisch absolut

                • Datenpunkt: Speicherverbrauch ioBroker in Prozent vom Gesamtsystem

                • Datenpunkt: CPU Last ioBroker vom Gesamtsystem

                Das neue Skript:

                ! ```
                `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';
                ! // regelmässige Wiederholungen der Abfrage
                var cronStr = "*/10 * * * ";
                ! var abfrage = 'ps -A aux --sort -pmem | 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'
                });
                ! 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 + ianzDP], // ioBroker Prozess (COMMAND = Kommando, mit dem der Prozess gestartet wurde)
                pid: arr[ 1 + i
                anzDP], // Prozess ID
                cpu: parseFloat(arr[ 2 + ianzDP]), // aktueller CPU-Last in %
                mem: parseFloat(arr[ 3 + i
                anzDP]), // aktueller Verbrauch physikalischer Speicher %
                vmem: parseInt(arr[ 4 + ianzDP]), //
                rss: parseInt(arr[ 5 + i
                anzDP]), // physikalische Speichernutzung
                start: arr[ 8 + ianzDP], // 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;
                

                ! 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);`
                ! 327_iobroker_prozesse.png [/i][/i][/i][/i]

                1 Reply Last reply Reply Quote 0
                • L
                  looxer01 last edited by

                  jap - hab ich genau so gemacht.

                  sieht dann so aus:

                  305_table.jpg

                  die 10 sind nur Testeinstellungen. Hier würde ich eben 6 10Px Spalten erwarten

                  1 Reply Last reply Reply Quote 0
                  • ruhr70
                    ruhr70 last edited by

                    @looxer01:

                    jap - hab ich genau so gemacht.

                    sieht dann so aus: `

                    Ich habe 100px unter Width eingetragen.

                    Keine Ahnung, was VIS nimmt, wenn Du px weglässt. Wahrscheinlich Prozent und dann kommst Du über 100%

                    1 Reply Last reply Reply Quote 0
                    • L
                      looxer01 last edited by

                      alles klar - hab die px vergessen - joah - so gehts - danke dir

                      1 Reply Last reply Reply Quote 0
                      • Homoran
                        Homoran Global Moderator Administrators last edited by

                        Bei mir sieht es so aus:
                        144_prozesse_002.jpg

                        Habe aber nicht viel gemacht.

                        Skript kopiert, gestartet.

                        in vis json-Tabelle eingefügt und Datenpunkt verknüpft.

                        Gruß

                        Rainer

                        1 Reply Last reply Reply Quote 0
                        • derAuge
                          derAuge last edited by

                          Trag mal "200px" ein. dann geht es

                          Gruß

                          Jürgen

                          1 Reply Last reply Reply Quote 0
                          • ruhr70
                            ruhr70 last edited by

                            327_system_bersicht.png

                            Ich hab das bisher so in meine Systemübersicht eingebaut.

                            Links sieht man die neuen Datenpunkte umrahmt.

                            Die Prozessliste öffnet sich als Dialog.

                            1 Reply Last reply Reply Quote 0
                            • T
                              thomassch last edited by

                              @ruhr70:

                              filename="Systemübersicht.png" index="0">~~

                              Ich hab das bisher so in meine Systemübersicht eingebaut.

                              Links sieht man die neuen Datenpunkte umrahmt.

                              Die Prozessliste öffnet sich als Dialog. `

                              Wie hast du die ESX Leistung ermittelt?

                              Nur mit hm Strommessung oder mit Script Abfrage des Nucs (insofern das überhaupt geht)

                              Gruß

                              Thomassch

                              Gesendet von iPhone mit Tapatalk

                              1 Reply Last reply Reply Quote 0
                              • ruhr70
                                ruhr70 last edited by

                                @thomassch:

                                Nur mit hm Strommessung oder mit Script Abfrage des Nucs (insofern das überhaupt geht) `

                                Zwischen USV und ESXi hängt ein Homematic Leistungsmesser.

                                1 Reply Last reply Reply Quote 0
                                • Homoran
                                  Homoran Global Moderator Administrators last edited by

                                  (Wie) Muss ich das json table widget konfigurieren.

                                  Ich habe nichts gemacht, lediglich den Datenpunkt angegeben.

                                  (oder ist das widget bsic-table vielleicht das falsche)

                                  Unter Objects wird folgendes angegzeigt:
                                  144_prozesse_003.jpg
                                  In der Tabell erscheinen jedoch die Prozessnamen nicht.

                                  Gruß

                                  Rainer

                                  1 Reply Last reply Reply Quote 0
                                  • ruhr70
                                    ruhr70 last edited by

                                    @Homoran:

                                    (Wie) Muss ich das json table widget konfigurieren.

                                    Ich habe nichts gemacht, lediglich den Datenpunkt angegeben.

                                    (oder ist das widget bsic-table vielleicht das falsche)

                                    Unter Objects wird folgendes angegzeigt:

                                    In der Tabell erscheinen jedoch die Prozessnamen nicht.

                                    Gruß

                                    Rainer `

                                    Hi Rainer,

                                    das Widget ist: basic - table (JSON table)

                                    Das Beispiel-Widget mit 3 Spalten (Datenpunkt-ID anpassen) zum Import:

                                    ! ````
                                    [{"tpl":"tplTableBody","data":{"visibility-cond":"==","visibility-val":1,"static_value":"[{"Title": "first", "Value": 1, "_Description": "Value1"}, {"Title": "second", "Value": 2, "_Description": "Value2"}]","gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"table_oid":"javascript.1.Systeminfos.ioBroker.Prozesse.ioBroker_Prozesse","colCount":"3","colWidth1":"200px","colWidth2":"100px","detailed_wid":"","max_rows":"10","colAttr2":"rss","colName2":"Speicher(kB)","colAttr3":"mem","colName3":"Speicher(%)","colWidth3":"100px","colName1":"ioBroker Prozess","colAttr1":"command"},"style":{"left":"120px","top":"170px","width":"500px","height":"270px"},"widgetSet":"basic"}]

                                    
                                     ![327_json_table.jpg](/assets/uploads/files/327_json_table.jpg) 
                                    
                                    1.) entweder der JSON-Attribut Name (wenn das Feld leer bleibt) oder ein frei vergebener Name, wie im Beispiel
                                    
                                    2.) Das JSON-Attribut (Spalte) gezielt ausgewählt. Sonst geht es nach der Reihenfolge
                                    
                                    3.) Breite, z.B. in Pixel (px)
                                    
                                    Im aktuellen Skript sind die möglichen Attribute:
                                    
                                    
                                            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
                                    
                                    
                                    Mit der JSON-Tabelle kann man ganz schnell Tabellen herstellen. Wenn alle Attribute eines JSONs gewünscht sind, dann muss man gar nichts einstellen, ggf. nur die einzelnen Breiten anpassen. Ansonsten kann man ncoh gezielt aussuchen, was man anzeigen lassen will. In dem Beispiel-Widget hier sind es drei Attribute, die gezielt angegeben werden.
                                    
                                    Das Beispiel-Widget wurde auf die ersten 10 Prozesse begrenzt (das JSON ist von größten zum niedrigsten physikalischen Speicherverbrauch sortiert). Bei mir sind 37 Prozesse aktiv.
                                    
                                    Gruß
                                    
                                    Michael
                                    1 Reply Last reply Reply Quote 0
                                    • Homoran
                                      Homoran Global Moderator Administrators last edited by

                                      Danke,

                                      muss ich mich mal ranmachen.

                                      Synchronosieren sich dann die Header und Spaltenbreiten wieder?

                                      Habe übrigens die Prozessnamen gefunden.

                                      Sie sind unsichtbar 😉 Bei doppelklick auf ein Feld sieht man sie ???

                                      PS ist das beispielwidget das, was unter der ID bereits eingefügt ist ("wenn keine ID")?

                                      Gruß

                                      Rainer

                                      1 Reply Last reply Reply Quote 0
                                      • ruhr70
                                        ruhr70 last edited by

                                        @Homoran:

                                        Synchronosieren sich dann die Header und Spaltenbreiten wieder? `

                                        Bei mir sind die Breiten im Header und bei den Daten darunter immer gleich.

                                        Keine Ahnung, wie Du das hinbekommen hast 😉

                                        @Homoran:

                                        Habe übrigens die Prozessnamen gefunden.

                                        Sie sind unsichtbar 😉 Bei doppelklick auf ein Feld sieht man sie ??? `

                                        Liegt wahrscheinlich dran, dass keine Breite zur Verfügung steht.

                                        Spiel mal ein bisschen mit dem Werten.

                                        @Homoran:

                                        PS ist das beispielwidget das, was unter der ID bereits eingefügt ist ("wenn keine ID")? `

                                        Hier verstehe ich nicht, was Du meinst.

                                        Das Beispiel-Widget ist das aus dem Post oben, mit den drei Spalten.

                                        Dort ist die ID: javascript.1.Systeminfos.ioBroker.Prozesse.ioBroker_Prozesse angegeben.

                                        Wenn Du eine andere Instanz nutzt, den Pfad oder den Datenpunktnamen im Skript angepasst hast, dann musst Du Deine ID mit dem JSON Objekt dort auswählen.

                                        Oder was meintest Du?

                                        Gruß

                                        Michael

                                        1 Reply Last reply Reply Quote 0
                                        • Homoran
                                          Homoran Global Moderator Administrators last edited by

                                          Bin anscheinend doch nicht so doof, wie ich befürchtet hatte.

                                          Es klappt einfach nicht!

                                          Der Header der ersten Spalte erscheint nicht, der Inhalt ist unsichtbar, dadurch auch die Verschiebung.
                                          144_prozesse_004.jpg

                                          und bei doppelklick in die erste Spalte sieht man auch den Text:
                                          144_prozesse_005.jpg

                                          Wenn ich jetzt das zweite Feld so formatiere, wie ich das erste hätte haben wollen, erscheint tatsächlich die Spaltenbeschriftung und der Inhalt.

                                          Allerdings erster Header und zweite Spalte.

                                          Hat es damit zu tun, dass da Headers[0], aber Name [1] steht?

                                          Gruß

                                          Rainer

                                          1 Reply Last reply Reply Quote 0
                                          • ruhr70
                                            ruhr70 last edited by

                                            Lösch das alte Widget doch bitte mal.

                                            Dann würde ich zum testen einmal das Beispiel-Widget importieren und dann es noch einmal an ein leeres Widget wagen.

                                            Das mit dem Header [0], Name [1] ist mir auch aufgefallen. Ich denke, dass ist nur ein Bezeichnungsfehler im Widget.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            822
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            14
                                            60
                                            6665
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo