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. Skripten / Logik
  4. warten auf exec befehl [resolved]

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    843

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

warten auf exec befehl [resolved]

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
12 Beiträge 5 Kommentatoren 1.2k Aufrufe 4 Watching
  • Ä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.
  • M Offline
    M Offline
    MarkusK
    schrieb am zuletzt editiert von MarkusK
    #1

    Hallo,
    ich möchte gerne ein exec in eine Funktion packen, welche aber erst zurück kommen soll, wenn der exec fertig ist. Ich könnte natürlich alle weiteren Befehle hinter "// weitere Befehle" schreiben, finde dies aber eher unübersichtlich. Gibt es andere elegante Möglichkeiten (mit promise, async, await etc)?

    function some_exec() {
        exec("sleep 5", function (error, stdout, stderr) { 
           log("exec ist fertig");
           // weitere Befehle
        }); 
    }
    some_exec();
    log("exec ist sofort zurück");
    
    F 1 Antwort Letzte Antwort
    0
    • M MarkusK

      Hallo,
      ich möchte gerne ein exec in eine Funktion packen, welche aber erst zurück kommen soll, wenn der exec fertig ist. Ich könnte natürlich alle weiteren Befehle hinter "// weitere Befehle" schreiben, finde dies aber eher unübersichtlich. Gibt es andere elegante Möglichkeiten (mit promise, async, await etc)?

      function some_exec() {
          exec("sleep 5", function (error, stdout, stderr) { 
             log("exec ist fertig");
             // weitere Befehle
          }); 
      }
      some_exec();
      log("exec ist sofort zurück");
      
      F Offline
      F Offline
      fastfoot
      schrieb am zuletzt editiert von
      #2

      @markusk

      function some_execAsync() {
          return new Promise((resolve, reject) => {
              exec("sleep 5", function (error, stdout, stderr) {
                  log("1 exec ist fertig");
                  resolve();
              });
          })
      }
      async function main() {
          await some_execAsync();
          log("2 exec ist fertig");
      }
      
      main()
      

      iobroker läuft unter Docker auf QNAP TS-451+
      SkriptRecovery: https://forum.iobroker.net/post/930558

      M 1 Antwort Letzte Antwort
      1
      • F fastfoot

        @markusk

        function some_execAsync() {
            return new Promise((resolve, reject) => {
                exec("sleep 5", function (error, stdout, stderr) {
                    log("1 exec ist fertig");
                    resolve();
                });
            })
        }
        async function main() {
            await some_execAsync();
            log("2 exec ist fertig");
        }
        
        main()
        
        M Offline
        M Offline
        MarkusK
        schrieb am zuletzt editiert von
        #3

        @fastfoot Danke

        1 Antwort Letzte Antwort
        0
        • Karel PuhliK Offline
          Karel PuhliK Offline
          Karel Puhli
          schrieb am zuletzt editiert von Karel Puhli
          #4

          Nabend!
          Das Thema ist schon etwas älter, aber passt so ziemlich genau auf meinen Anwendungsfall. Ich möchte mir per Telegram Bilder von der Cam zuschicken.
          Folgendes Script liegt zu Grunde:

          const idTestTrigger = "0_userdata.0.Fenster1";
          
          
          async function fotoMachen() {
              return new Promise ((resolve) => {
                  exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/");
                  exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Wintergarten.jpg http://10.146.26.135:8765/picture/1/current/");
                  resolve();
              });
          }
          
          
          async function fotoSenden() {
              await fotoMachen();
              sendTo(`telegram`, `/home/iobroker/IP_Cam/Snapshots/Garten.jpg`);
              sendTo(`telegram`, `/home/iobroker/IP_Cam/Snapshots/Wintergarten.jpg`);
          }
          
          on({id: idTestTrigger, change: "any"}, async function () {
              await fotoSenden();
          })
          

          Es funktioniert trotz promise, trotz await und sonst was leider nicht. Die Lösung mit einem Timeout vor dem sendTo kenne ich, sie funktioniert auch. Nur wollte ich es etwas eleganter machen. Leider habe ich wohl einen Nagel im Kopf. Hat jemand ne Idee

          Log:

          elegram.0	2023-06-15 20:22:02.837	error	Cannot send photo [chatId - 1271149145]: Error: ETELEGRAM: 400 Bad Request: file must be non-empty
          

          LG Karel

          T 1 Antwort Letzte Antwort
          0
          • Karel PuhliK Karel Puhli

            Nabend!
            Das Thema ist schon etwas älter, aber passt so ziemlich genau auf meinen Anwendungsfall. Ich möchte mir per Telegram Bilder von der Cam zuschicken.
            Folgendes Script liegt zu Grunde:

            const idTestTrigger = "0_userdata.0.Fenster1";
            
            
            async function fotoMachen() {
                return new Promise ((resolve) => {
                    exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/");
                    exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Wintergarten.jpg http://10.146.26.135:8765/picture/1/current/");
                    resolve();
                });
            }
            
            
            async function fotoSenden() {
                await fotoMachen();
                sendTo(`telegram`, `/home/iobroker/IP_Cam/Snapshots/Garten.jpg`);
                sendTo(`telegram`, `/home/iobroker/IP_Cam/Snapshots/Wintergarten.jpg`);
            }
            
            on({id: idTestTrigger, change: "any"}, async function () {
                await fotoSenden();
            })
            

            Es funktioniert trotz promise, trotz await und sonst was leider nicht. Die Lösung mit einem Timeout vor dem sendTo kenne ich, sie funktioniert auch. Nur wollte ich es etwas eleganter machen. Leider habe ich wohl einen Nagel im Kopf. Hat jemand ne Idee

            Log:

            elegram.0	2023-06-15 20:22:02.837	error	Cannot send photo [chatId - 1271149145]: Error: ETELEGRAM: 400 Bad Request: file must be non-empty
            

            LG Karel

            T Nicht stören
            T Nicht stören
            ticaki
            schrieb am zuletzt editiert von ticaki
            #5

            @karel-puhli

            Hatte erst was mit callbacks geschrieben aber geht auch komplizierter :) Code hab ich bei fastfood geklaut

            function some_execAsync() {
                return new Promise((resolve, reject) => {
                    exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/", function (error, stdout, stderr) {
                        log("1 exec ist fertig");
                        resolve();
                    });
                })
            }
            

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            Karel PuhliK F 3 Antworten Letzte Antwort
            1
            • T ticaki

              @karel-puhli

              Hatte erst was mit callbacks geschrieben aber geht auch komplizierter :) Code hab ich bei fastfood geklaut

              function some_execAsync() {
                  return new Promise((resolve, reject) => {
                      exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/", function (error, stdout, stderr) {
                          log("1 exec ist fertig");
                          resolve();
                      });
                  })
              }
              
              Karel PuhliK Offline
              Karel PuhliK Offline
              Karel Puhli
              schrieb am zuletzt editiert von
              #6

              @ticaki
              Oh man, so hatte ich es vorhin tatsächlich schon mal stehen. Anscheinend war irgendwo doch ein "Schreibfehler" oder so drin...
              Trotzdem vielen Dank natürlich an Dich!!!

              1 Antwort Letzte Antwort
              0
              • T ticaki

                @karel-puhli

                Hatte erst was mit callbacks geschrieben aber geht auch komplizierter :) Code hab ich bei fastfood geklaut

                function some_execAsync() {
                    return new Promise((resolve, reject) => {
                        exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/", function (error, stdout, stderr) {
                            log("1 exec ist fertig");
                            resolve();
                        });
                    })
                }
                
                F Offline
                F Offline
                fastfoot
                schrieb am zuletzt editiert von
                #7

                @ticaki sagte in warten auf exec befehl [resolved]:

                bei fastfood geklaut

                das geht garnicht, ich schenk' ihn dir :-)
                hier noch eine Alternative:

                const util = require("util");
                const execAsync = util.promisify(require("child_process").exec);
                
                const test = async (cmd) => {
                    let erg = await execAsync(cmd);
                
                    log('1 ' + erg.stdout)
                    log('2 ' + erg.stderr)
                }
                
                test('ls')
                

                iobroker läuft unter Docker auf QNAP TS-451+
                SkriptRecovery: https://forum.iobroker.net/post/930558

                T 1 Antwort Letzte Antwort
                0
                • F fastfoot

                  @ticaki sagte in warten auf exec befehl [resolved]:

                  bei fastfood geklaut

                  das geht garnicht, ich schenk' ihn dir :-)
                  hier noch eine Alternative:

                  const util = require("util");
                  const execAsync = util.promisify(require("child_process").exec);
                  
                  const test = async (cmd) => {
                      let erg = await execAsync(cmd);
                  
                      log('1 ' + erg.stdout)
                      log('2 ' + erg.stderr)
                  }
                  
                  test('ls')
                  
                  T Nicht stören
                  T Nicht stören
                  ticaki
                  schrieb am zuletzt editiert von
                  #8

                  @fastfoot
                  den will ich auch geschenkt haben :)

                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                  Spenden

                  F 1 Antwort Letzte Antwort
                  0
                  • T ticaki

                    @fastfoot
                    den will ich auch geschenkt haben :)

                    F Offline
                    F Offline
                    fastfoot
                    schrieb am zuletzt editiert von
                    #9

                    @ticaki sagte in warten auf exec befehl [resolved]:

                    @fastfoot
                    den will ich auch geschenkt haben :)

                    nur zu :-) wichtiger als diese Schnipsel ist aber die Tatsache dass man mit beiden Methoden fast alles was einen callback nutzt in ein Promise wandeln kann, auf welches man dann ganz bequem mit await warten kann. Gut für ältere Tools welche callbacks verwenden, neuere bieten ja fast immer auch eine Version mit Promise an. Auch wichtig, eine async function zu erstellen macht nur dann Sinn wenn man darin auch await verwendet

                    iobroker läuft unter Docker auf QNAP TS-451+
                    SkriptRecovery: https://forum.iobroker.net/post/930558

                    1 Antwort Letzte Antwort
                    0
                    • T ticaki

                      @karel-puhli

                      Hatte erst was mit callbacks geschrieben aber geht auch komplizierter :) Code hab ich bei fastfood geklaut

                      function some_execAsync() {
                          return new Promise((resolve, reject) => {
                              exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/", function (error, stdout, stderr) {
                                  log("1 exec ist fertig");
                                  resolve();
                              });
                          })
                      }
                      
                      Karel PuhliK Offline
                      Karel PuhliK Offline
                      Karel Puhli
                      schrieb am zuletzt editiert von
                      #10

                      @ticaki sagte in warten auf exec befehl [resolved]:

                      erst was mit callbacks geschrieben aber geht auch komplizierter

                      Naja, ich finde callbacks eher kompliziert zum Lesen. ;-)

                      @fastfoot sagte in warten auf exec befehl [resolved]:

                      eine async function zu erstellen macht nur dann Sinn wenn man darin auch await verwendet

                      Blockly bildet ja eigentlich immer async ab, ob await vorkommt, oder nicht. Ist ja auch nicht schädlich, oder?

                      F 1 Antwort Letzte Antwort
                      0
                      • Karel PuhliK Karel Puhli

                        @ticaki sagte in warten auf exec befehl [resolved]:

                        erst was mit callbacks geschrieben aber geht auch komplizierter

                        Naja, ich finde callbacks eher kompliziert zum Lesen. ;-)

                        @fastfoot sagte in warten auf exec befehl [resolved]:

                        eine async function zu erstellen macht nur dann Sinn wenn man darin auch await verwendet

                        Blockly bildet ja eigentlich immer async ab, ob await vorkommt, oder nicht. Ist ja auch nicht schädlich, oder?

                        F Offline
                        F Offline
                        fastfoot
                        schrieb am zuletzt editiert von
                        #11

                        @karel-puhli in JS schadet es der Lesbarkeit bzw Verständlichkeit, ansonsten schadet es nicht. In Blockly vermute ich ist es der Einfachheit wegen, async davor und passt immer

                        iobroker läuft unter Docker auf QNAP TS-451+
                        SkriptRecovery: https://forum.iobroker.net/post/930558

                        A 1 Antwort Letzte Antwort
                        1
                        • F fastfoot

                          @karel-puhli in JS schadet es der Lesbarkeit bzw Verständlichkeit, ansonsten schadet es nicht. In Blockly vermute ich ist es der Einfachheit wegen, async davor und passt immer

                          A Offline
                          A Offline
                          Axel21
                          schrieb am zuletzt editiert von
                          #12

                          @fastfoot
                          Beim Suchen nach Exec und wait bin ich hierher gekommen. Auch wenn das Thema etwas älter ist, es bleibt aktuell. Und danke für die vielen Anregungen!
                          Für alle, die in BLOCKLY eine execcmd- Funktion möchten, die auf das Ergebnis des Kommandos wartet und das Ergebnis dann auch direkt an eine Variable weitergeben kann: Hier die entsprechende JS-Funktion, die man in den Block "JS-Funktion mit Ergebnis" innerhalb Blockly -> Funktionen einfügt.

                          return new Promise((resolve, reject) => {
                                  exec(cmd, function (error, stdout, stderr) {
                                      resolve(stdout);
                                  });
                              });
                          

                          Den Unterschied zum klassischen exec-Block sieht man an folgendem Beispiel (Timestamps beachten).
                          Wer mit asynchroner JS-Programmierung superfit ist, und verschachtelte callbacks mag, braucht das natürlich nicht :-) Vielleicht hilft es ja jemandem, der wie ich danach gesucht hat.
                          Bildschirmfoto vom 2025-07-14 15-42-25.png

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


                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          720

                          Online

                          32.6k

                          Benutzer

                          82.1k

                          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