Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. python script starten und wieder stoppen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    python script starten und wieder stoppen

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

      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

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

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

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

        etv 1 Reply Last reply Reply Quote 0
        • etv
          etv @etv last edited by

          .... 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

          AlCalzone 1 Reply Last reply Reply Quote 0
          • AlCalzone
            AlCalzone Developer @etv last edited by AlCalzone

            @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.

            1 Reply Last reply Reply Quote 1
            • etv
              etv last edited by

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

              Liebe Grüße
              Tom

              1 Reply Last reply Reply Quote 0
              • I
                IOJoker last edited by

                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!

                AlCalzone 1 Reply Last reply Reply Quote 0
                • AlCalzone
                  AlCalzone Developer @IOJoker last edited by

                  @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 2 Replies Last reply Reply Quote 0
                  • I
                    IOJoker @AlCalzone last edited by

                    @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.

                    AlCalzone 1 Reply Last reply Reply Quote 0
                    • AlCalzone
                      AlCalzone Developer @IOJoker last edited by

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

                      I 1 Reply Last reply Reply Quote 0
                      • I
                        IOJoker @AlCalzone last edited by

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

                        1 Reply Last reply Reply Quote 0
                        • I
                          IOJoker last edited by

                          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 Reply Last reply Reply Quote 0
                          • F
                            fastfoot @IOJoker last edited by

                            @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

                            AlCalzone 1 Reply Last reply Reply Quote 0
                            • AlCalzone
                              AlCalzone Developer @fastfoot last edited by

                              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.

                              1 Reply Last reply Reply Quote 0
                              • I
                                IOJoker @AlCalzone last edited by

                                @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 Reply Last reply Reply Quote 0
                                • I
                                  IOJoker last edited by

                                  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 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  972
                                  Online

                                  31.8k
                                  Users

                                  80.0k
                                  Topics

                                  1.3m
                                  Posts

                                  4
                                  15
                                  1691
                                  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