CUxD System.Exec Shell Skript so lange laufen lassen, wie Aktorkanal ein
Verfasst: 23.08.2023, 15:09
Hallo zusammen,
zunächst zur Ausgangslage bzw. wie ich drauf komme: ich habe ein CUxD System.Exec (CUX280100x) Gerät als Schaltaktor angelegt, mit dem ich Skripte auf dem Raspberry Pi starte und stoppe. Die jeweiligen Skripte sollen so lange laufen, wie der zugehörige Aktorkanal auf Ein steht.
Im Moment mache ich das gefühlt recht umständlich, im CMD_LONG wird ein curl gestartet, das per HTTP auf dem Pi (Apache2) ein PHP aufruft, das per system() das gewünschte Skript im Hintergrund ausführt.
CMD_LONG = curl http://host/ccu/kamera.php
<?php system('/usr/src/homematic/kamera.sh >/dev/null &'); ?>
Die Skripte sind dann überwiegend Schleifen, die alle X Sekunden irgendwas machen, zum Beispiel einen Snapshot von einer Webcam speichern oder versuchen, das Auto zu pingen. Damit ich die Skripte über den Aus Button stoppen kann, prüfe ich bei jedem Schleifendurchlauf per RemoteSkriptAPI, ob der Aktorkanal noch auf Ein steht.
Da ich PivCCU3 verwende, habe ich im Dateisystem des Hosts einen Pfad, der in den Container zeigt. Das heißt ich könnte dort relativ einfach die Bash Skripte rein legen und diese direkt von CUxD ausführen lassen. Soweit, so einfach.
Jetzt zur Frage, wo ich im Moment hänge. Wie kriege ich ein Skript, das ich mittels CMD_LONG gestartet habe, und das im Hintergrund laufen soll, wieder gestoppt, wenn der Aktorkanal ausgeschaltet wird? Ich muss gestehen, dass ich für das CUxD Handbuch an der Stelle ein wenig zu blond bin.
Ein weiteres Thema wäre das Handling von Instanzen. Wenn ein Aktorkanal bereits Ein ist, das Skript also bereits läuft, und nochmal auf Ein gedrückt wird oder ein Programm/Skript den Aktorkanal auf Ein setzt, soll keine zweite Instanz des Skripts gestartet werden, weil sich die beiden sonst ziemlich sicher ins Gehege kommen würden. Auf dem Pi verwende ich dazu pid files.
zunächst zur Ausgangslage bzw. wie ich drauf komme: ich habe ein CUxD System.Exec (CUX280100x) Gerät als Schaltaktor angelegt, mit dem ich Skripte auf dem Raspberry Pi starte und stoppe. Die jeweiligen Skripte sollen so lange laufen, wie der zugehörige Aktorkanal auf Ein steht.
Im Moment mache ich das gefühlt recht umständlich, im CMD_LONG wird ein curl gestartet, das per HTTP auf dem Pi (Apache2) ein PHP aufruft, das per system() das gewünschte Skript im Hintergrund ausführt.
CMD_LONG = curl http://host/ccu/kamera.php
<?php system('/usr/src/homematic/kamera.sh >/dev/null &'); ?>
Die Skripte sind dann überwiegend Schleifen, die alle X Sekunden irgendwas machen, zum Beispiel einen Snapshot von einer Webcam speichern oder versuchen, das Auto zu pingen. Damit ich die Skripte über den Aus Button stoppen kann, prüfe ich bei jedem Schleifendurchlauf per RemoteSkriptAPI, ob der Aktorkanal noch auf Ein steht.
Da ich PivCCU3 verwende, habe ich im Dateisystem des Hosts einen Pfad, der in den Container zeigt. Das heißt ich könnte dort relativ einfach die Bash Skripte rein legen und diese direkt von CUxD ausführen lassen. Soweit, so einfach.
Jetzt zur Frage, wo ich im Moment hänge. Wie kriege ich ein Skript, das ich mittels CMD_LONG gestartet habe, und das im Hintergrund laufen soll, wieder gestoppt, wenn der Aktorkanal ausgeschaltet wird? Ich muss gestehen, dass ich für das CUxD Handbuch an der Stelle ein wenig zu blond bin.
Ein weiteres Thema wäre das Handling von Instanzen. Wenn ein Aktorkanal bereits Ein ist, das Skript also bereits läuft, und nochmal auf Ein gedrückt wird oder ein Programm/Skript den Aktorkanal auf Ein setzt, soll keine zweite Instanz des Skripts gestartet werden, weil sich die beiden sonst ziemlich sicher ins Gehege kommen würden. Auf dem Pi verwende ich dazu pid files.