Interrupt über Apache an Python Script senden?

  • Hallo zusammen,


    ich würde gerne eine Website erstellen, die mit den eingegebenen Formulardaten ein Python Script aufruft, welches dann gewisse GPIOs ansteuert. Soweit so gut – bis jetzt kein Problem zu programmieren. Ich habe mir nach einigen Tutorials eine Webseite erstellt, die einfach über PHP mit exec() das Python Skript ausführt, was auch funktioniert.


    Ich möchte jedoch einen "Not-Aus" Button auf der Website einbauen, der das Script sozusagen wie ein STRG+C KeyboardInterrupt beendet. Ist es überhaupt möglich in das Script zu bekommen?


    Oder würdet ihr bei einer solchen Aufgabe generell zu CGI oder einem Framework wie WebIOPi greifen?


    Danke im Vorraus
    valbitz

  • Das ist eines der simplen Programme zu Testzwecken. Wenn ich es über exec() starte, läuft es unbegrenzt. Jetzt will ich über einen button irgendwie den KeyboardInterrupt triggern oder das Programm eben beenden und GPIO.cleanup() durchführen.


  • Es gibt wie immer mehrere Möglichkeiten. Auch hier hast du wieder mehrere ;)


    - Du könntest mithilfe des Konsolen Befehls kill und dem Python Module signal ein SIGINT (oder SIGTERM, musste dann aber im Script ändern!) abfangen und das Script sauber beenden. Das wäre besser als es stumpf zu töten, weil sonst kein GPIO.cleanup ausgeführt wird.


    Beispiel:[code=php]import signal
    import sys


    def signal_handler(signal, frame):
    print('Script Interrupted! (Control-C)')
    sys.exit(0)


    signal.signal(signal.SIGINT, signal_handler)
    signal.pause()[/php]


    Das speicherst du zum Beispiel als test.py und führst es aus: python test.py
    Anschließend öffnest du ein weiteren Terminal/PuTTy und gibst dort folgendes ein: kill -s SIGINT $(ps aux | grep -v grep | grep test.py | awk {'print $2'})


    Was dieser Befehl macht ist folgendes: es schickt an die PID des laufenden Scripts ein SIGINT ... Sieht etwas umständlich aus wegen des ps aux...usw aber ging jetzt am schnellsten als alles einzeln zu erklärn wie du an die PID kommst :fies:


    Wenn du jetzt das Script noch mal ausführst und dann STRG+C drückst wird die selbe Anweisung ausgeführt, da STRG+C auch ein SIGINT bewirkt ;)

  • Hallo,


    ich starte ein Skript test.py über die App HotButton mit

    Code
    python test.py &

    . Nun möchte ich es wieder beenden und drücke einen anderen Button wo dieser Code

    Code
    kill -s SIGINT $(ps aux | grep -v grep | grep test.py | awk {'print $2'})

    hinterlegt ist. Jedoch funktioniert es nicht und ich weiß nicht wieso...wenn ich es über Putty teste: Code starten und dann mit

    Code
    kill -s SIGINT $(ps aux | grep -v grep | grep test.py | awk {'print $2'})

    beenden, funktioniert es!
    Was mache ich falsch ?