CUxD System.Exec Shell Skript so lange laufen lassen, wie Aktorkanal ein

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Antworten
rentier-s
Beiträge: 385
Registriert: 19.06.2017, 09:24
Hat sich bedankt: 20 Mal
Danksagung erhalten: 67 Mal

CUxD System.Exec Shell Skript so lange laufen lassen, wie Aktorkanal ein

Beitrag von rentier-s » 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.

Benutzeravatar
uwe111
Beiträge: 4822
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 246 Mal
Kontaktdaten:

Re: CUxD System.Exec Shell Skript so lange laufen lassen, wie Aktorkanal ein

Beitrag von uwe111 » 23.08.2023, 16:23

rentier-s hat geschrieben:
23.08.2023, 15:09
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 vom CUxD mittels CMD_LONG oder CMD_SHORT gestartetes Script kannst Du mittels CMD_KILL beenden. Dafür darf es aber nicht im Hintergrund laufen.

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

rentier-s
Beiträge: 385
Registriert: 19.06.2017, 09:24
Hat sich bedankt: 20 Mal
Danksagung erhalten: 67 Mal

Re: CUxD System.Exec Shell Skript so lange laufen lassen, wie Aktorkanal ein

Beitrag von rentier-s » 24.08.2023, 10:12

Hallo Uwe,

funktioniert das dann, wenn ich im CMD_SHORT

Code: Alles auswählen

extra/timer.tcl CUxD.CUX2801001:1.CMD_KILL 1
ausführe? Oder killt sich das SHORT dann nur selbst und das vorher abgesetzte LONG läuft weiter?

Weil ansonsten müsste ich für jeden Kanal ein Programm
Wenn Aktorkanal = Aus bei Aktualisierung => Dann CMD_KILL
anlegen.

Benutzeravatar
uwe111
Beiträge: 4822
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 246 Mal
Kontaktdaten:

Re: CUxD System.Exec Shell Skript so lange laufen lassen, wie Aktorkanal ein

Beitrag von uwe111 » 24.08.2023, 11:27

rentier-s hat geschrieben:
24.08.2023, 10:12
funktioniert das dann, wenn ich im CMD_SHORT

Code: Alles auswählen

extra/timer.tcl CUxD.CUX2801001:1.CMD_KILL 1
ausführe? Oder killt sich das SHORT dann nur selbst und das vorher abgesetzte LONG läuft weiter?
.CMD_KILL 1 killt CMD_LONG und .CMD_KILL 0 killt CMD_SHORT So steht es auch in der CUxD-Doku.

Oder lege in Deinem CMD_LONG Script doch einfach eine Datei im Filesystem an. Diese Datei kannst Du dann mittels CMD_SHORT löschen. Das prüfst Du in Deinem CMD_LONG Script und dann beendest Du es. Das ist auf jeden Fall sauberer, als ein KILL.

Du könntest natürlich im CMD_LONG Script auch die PID in eine Datei schreiben und diese dann mittels CMD_SHORT killen.

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

rentier-s
Beiträge: 385
Registriert: 19.06.2017, 09:24
Hat sich bedankt: 20 Mal
Danksagung erhalten: 67 Mal

Re: CUxD System.Exec Shell Skript so lange laufen lassen, wie Aktorkanal ein

Beitrag von rentier-s » 25.08.2023, 12:11

Hm, OK. Alles nicht so einfach, wie ich es mir erhofft hatte. Wahrscheinlich werde ich es dann so lassen wie bisher. Oder ich baue in die PHPs eine Funktion zum Löschen der pid Dateien ein und rufe das über den CMD_SHORT auf.

Danke Dir trotzdem!

Antworten

Zurück zu „CUxD“