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. JavaScript
  5. python script starten und wieder stoppen

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.3k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

python script starten und wieder stoppen

Geplant Angeheftet Gesperrt Verschoben JavaScript
15 Beiträge 4 Kommentatoren 2.0k 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.
  • etvE Offline
    etvE Offline
    etv
    schrieb am zuletzt editiert von
    #1

    Liebe Leute,

    nach ein paar Versuchen ist es mir nun gelungen ein Python Script aus ioBroker zu starten

    exec('python /home/pi/scripts/atem.py 192.168.68.121');
    

    Das Script läuft im Hintergrund und schaltet mir die GPIO's, deren Zustände ich dann wieder in ioBroker auswerte.

    Kann ich dieses Script auch wieder in ioBroker stoppen??

    Liebe Grüße
    Tom

    …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

    1 Antwort Letzte Antwort
    0
    • etvE Offline
      etvE Offline
      etv
      schrieb am zuletzt editiert von
      #2

      ....noch eine weitere Frage in diesem Zusammenhang an unsere Gurus:

      kann ich aus ioBroker an den oben ausgelösten Prozess ein "ctrl-C" senden??

      …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

      etvE 1 Antwort Letzte Antwort
      0
      • etvE etv

        ....noch eine weitere Frage in diesem Zusammenhang an unsere Gurus:

        kann ich aus ioBroker an den oben ausgelösten Prozess ein "ctrl-C" senden??

        etvE Offline
        etvE Offline
        etv
        schrieb am zuletzt editiert von
        #3

        .... zur Info: Problem gelöst, mit

        ecex ("kill - 2 xxxProzessnummerxxx) und diese Nummer hol ich mir via exec(PS - alx | grep xxxProggrammnamexxx)

        Liebe Grüße
        Tom

        …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

        AlCalzoneA 1 Antwort Letzte Antwort
        0
        • etvE etv

          .... zur Info: Problem gelöst, mit

          ecex ("kill - 2 xxxProzessnummerxxx) und diese Nummer hol ich mir via exec(PS - alx | grep xxxProggrammnamexxx)

          Liebe Grüße
          Tom

          AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          schrieb am zuletzt editiert von AlCalzone
          #4

          @etv Das geht auch einfacher. exec ruft intern die exec-Methode des child_process-Moduls auf (https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback)

          Diese gibt eine Referenz auf den Prozess zurück, den man z.B. mit der kill-Methode beenden kann:
          https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal

          Das Beispiel dort nutzt spawn statt exec, der Rest funktioniert aber analog.

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          1 Antwort Letzte Antwort
          1
          • etvE Offline
            etvE Offline
            etv
            schrieb am zuletzt editiert von
            #5

            ...hey cool, danke dir für die Info! Werd' ich gleich "umstricken"

            Liebe Grüße
            Tom

            …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

            1 Antwort Letzte Antwort
            0
            • I Offline
              I Offline
              IOJoker
              schrieb am zuletzt editiert von
              #6

              Hallo zusammen,

              ich stehe eigentlich vor der identischen Aufgabe, wie sie hier geschildert wurde. Leider reichen meine Fähigkeiten scheinbar noch nicht aus, um mit den gegebenen Hinweisen selbst zur Lösung zu kommen. Vielleicht kann mir jemand zusätzlich unter die Arme greifen...

              Das Python Skript, welches ich erfolgreich mit dem Exec Befehl starte, enthält eine Endlosschleife. Wenn ich im IOBroker Admin das aufrufende Skript über die Start/Stop Schaltfläche beende, läuft das Python Skript im Hintergrund ungewollt weiter. Ich hätte gern, dass mit dem Betätigen der Stop Schaltfläche auch das aufgerufene Skript beendet wird.

              Hier ist beispielhaft der Aufruf durch die Exec Anweisung:

              exec("python3 Skriptpfad.py", function(err, stdout, stderr) {
                        if(err) log('Exec-Fehler: '+ stderr, 'error');
              });
              

              Recht vielen Dank!

              AlCalzoneA 1 Antwort Letzte Antwort
              0
              • I IOJoker

                Hallo zusammen,

                ich stehe eigentlich vor der identischen Aufgabe, wie sie hier geschildert wurde. Leider reichen meine Fähigkeiten scheinbar noch nicht aus, um mit den gegebenen Hinweisen selbst zur Lösung zu kommen. Vielleicht kann mir jemand zusätzlich unter die Arme greifen...

                Das Python Skript, welches ich erfolgreich mit dem Exec Befehl starte, enthält eine Endlosschleife. Wenn ich im IOBroker Admin das aufrufende Skript über die Start/Stop Schaltfläche beende, läuft das Python Skript im Hintergrund ungewollt weiter. Ich hätte gern, dass mit dem Betätigen der Stop Schaltfläche auch das aufgerufene Skript beendet wird.

                Hier ist beispielhaft der Aufruf durch die Exec Anweisung:

                exec("python3 Skriptpfad.py", function(err, stdout, stderr) {
                          if(err) log('Exec-Fehler: '+ stderr, 'error');
                });
                

                Recht vielen Dank!

                AlCalzoneA Offline
                AlCalzoneA Offline
                AlCalzone
                Developer
                schrieb am zuletzt editiert von
                #7

                @iojoker

                const proc = exec("python3 Skriptpfad.py", function(err, stdout, stderr) {
                  if(err) log('Exec-Fehler: '+ stderr, 'error');
                });
                
                onStop(() => {
                  proc.kill("SIGTERM"); // oder ein anderes Signal?
                });
                

                Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                I 2 Antworten Letzte Antwort
                0
                • AlCalzoneA AlCalzone

                  @iojoker

                  const proc = exec("python3 Skriptpfad.py", function(err, stdout, stderr) {
                    if(err) log('Exec-Fehler: '+ stderr, 'error');
                  });
                  
                  onStop(() => {
                    proc.kill("SIGTERM"); // oder ein anderes Signal?
                  });
                  
                  I Offline
                  I Offline
                  IOJoker
                  schrieb am zuletzt editiert von
                  #8

                  @alcalzone said in python script starten und wieder stoppen:

                  proc.kill("SIGTERM")

                  Hallo und vielen Dank für die ultraschnelle Antwort. Die Anweisungen laufen durch, leider wird das Python Skript jedoch nicht beendet. Es bleibt aktiv. Statt SIGTERM habe ich auch bereits SIGKILL versucht.

                  AlCalzoneA 1 Antwort Letzte Antwort
                  0
                  • I IOJoker

                    @alcalzone said in python script starten und wieder stoppen:

                    proc.kill("SIGTERM")

                    Hallo und vielen Dank für die ultraschnelle Antwort. Die Anweisungen laufen durch, leider wird das Python Skript jedoch nicht beendet. Es bleibt aktiv. Statt SIGTERM habe ich auch bereits SIGKILL versucht.

                    AlCalzoneA Offline
                    AlCalzoneA Offline
                    AlCalzone
                    Developer
                    schrieb am zuletzt editiert von
                    #9

                    @iojoker Hmm, kannst du das Python-Skript ggf. so anpassen, dass es sich z.B. bei einem SIGINT selbst beendet?

                    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                    I 1 Antwort Letzte Antwort
                    0
                    • AlCalzoneA AlCalzone

                      @iojoker Hmm, kannst du das Python-Skript ggf. so anpassen, dass es sich z.B. bei einem SIGINT selbst beendet?

                      I Offline
                      I Offline
                      IOJoker
                      schrieb am zuletzt editiert von
                      #10

                      @alcalzone Werde ich prüfen, ob ich das hinbekomme. Melde mich dann.

                      1 Antwort Letzte Antwort
                      0
                      • I Offline
                        I Offline
                        IOJoker
                        schrieb am zuletzt editiert von
                        #11

                        Ich war mir dessen gar nicht mehr bewusst, aber in meinem Python Skript wurde bereits das SIGINT ausgewertet. Das funktioniert auch, wenn ich über die Konsole z.B.

                        sudo kill -2 Prozess_ID
                        

                        eingebe.

                        Scheinbar kommt das Signal aus js nicht beim Python an. Vielleicht ein Rechteproblem?

                        F 1 Antwort Letzte Antwort
                        0
                        • I IOJoker

                          Ich war mir dessen gar nicht mehr bewusst, aber in meinem Python Skript wurde bereits das SIGINT ausgewertet. Das funktioniert auch, wenn ich über die Konsole z.B.

                          sudo kill -2 Prozess_ID
                          

                          eingebe.

                          Scheinbar kommt das Signal aus js nicht beim Python an. Vielleicht ein Rechteproblem?

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

                          @iojoker sagte in python script starten und wieder stoppen:

                          Vielleicht ein Rechteproblem?

                          probiere in der Konsole den kill Befehl als user iobroker. Dazu vorher entweder su iobroker oder sudo -u iobroker bash eingeben

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

                          AlCalzoneA 1 Antwort Letzte Antwort
                          0
                          • F fastfoot

                            @iojoker sagte in python script starten und wieder stoppen:

                            Vielleicht ein Rechteproblem?

                            probiere in der Konsole den kill Befehl als user iobroker. Dazu vorher entweder su iobroker oder sudo -u iobroker bash eingeben

                            AlCalzoneA Offline
                            AlCalzoneA Offline
                            AlCalzone
                            Developer
                            schrieb am zuletzt editiert von
                            #13

                            Ziemlich sicher, dass iobroker keinen kill-Befehl per sudo absetzen kann. Allerdings startet das Skript ja auch als der gleiche User, daher ist es schon komisch...

                            Eine Alternative wäre noch direkt per stdin mit dem Prozess zu kommunizieren und da ein Kommando abzusetzen. Z.b. so:

                            onStop(() => {
                              proc.stdin.write("close");
                            });
                            

                            und dann im python-skript stdin lesen, wenn "close" kommt sich selbst beenden.

                            Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                            1 Antwort Letzte Antwort
                            0
                            • AlCalzoneA AlCalzone

                              @iojoker

                              const proc = exec("python3 Skriptpfad.py", function(err, stdout, stderr) {
                                if(err) log('Exec-Fehler: '+ stderr, 'error');
                              });
                              
                              onStop(() => {
                                proc.kill("SIGTERM"); // oder ein anderes Signal?
                              });
                              
                              I Offline
                              I Offline
                              IOJoker
                              schrieb am zuletzt editiert von
                              #14

                              @alcalzone

                              Guten Abend,

                              ich habe das Problem weiter eingrenzen können. Wenn ich mit

                              console.log(proc.pid);
                              

                              die process ID ausgebe, ist sie scheinbar immer um eins kleiner als das, was ich im process status der Konsole sehen kann.

                              iobroker 19189  0.1  0.0   1940   396 ?        S    20:14   0:00 /bin/sh -c python3 Skriptpfad.py
                              iobroker 19190 10.0  0.5  79812 43620 ?        Sl   20:14   0:01 python3 Skriptpfad.py
                              

                              Die 19190 ist der Prozess, den ich beenden möchte. Der "ChildProcess" gibt aber die ID 19189 zurück. Macht das Sinn?

                              1 Antwort Letzte Antwort
                              0
                              • I Offline
                                I Offline
                                IOJoker
                                schrieb am zuletzt editiert von
                                #15

                                So, nach etwas längerem Rumprobieren habe ich jetzt eine Lösung gefunden, die bisher zu funktionieren scheint. So ganz gefällt mir das nicht, dass ich auf die child_proc.pid immer 1 draufaddieren muss, aber besser bekomme ich es jetzt erstmal nicht hin:

                                // Python-Skript auf Systemebene ausführen
                                const child_proc = exec("python3 Skriptpfad.py", function(err, stdout, stderr) {
                                  if(err) log('Exec-Fehler: '+ stderr, 'error');
                                });
                                
                                var child_pid = child_proc.pid + 1; // die PID des Python Skripts ist eine größer als die Shell
                                console.log(`Die PID ist  ${child_pid}`); // PID in Konsole ausgeben
                                
                                // Wenn das js-Skript beendet wird, soll das Python-Skript ebenfalls beendet werden (entspricht Strg+C)
                                onStop(() => {
                                  exec(`kill -2 ${child_pid}`); // Child Prozess beenden mit Signal -2 (entspricht SIGINT)
                                  console.log("Skript beendet!");
                                });
                                

                                Vielen Dank allen Helfern!

                                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

                                770

                                Online

                                32.5k

                                Benutzer

                                81.7k

                                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