[gelöst]Problem beim ausführen von Kodi in c++ Programm

  • Moin Zusammen.
    Stehe vor einem Problem das ich bereits lange Zeit versuche zu lösen.


    Ich habe mir ein c++ Programm geschrieben das die Steuerung (Starten/beenden) von VDR, Kodi, Musik und weiteren Programmen auf meinem RasPi per Fernbedienung übernimmt.
    In diesem Programm starte ich diese Programme mit "popen" (mit "system" gibt's übrigens das selbe Problem).


    Jetzt zu meinem Problem:
    Bei Kodi habe ich das Problem dass, sobald sich im OSD die Verzeichnisauswahl öffnen will (zB beim hinzufügen von Ordnern) schmiert mir Kodi ab. Das Kodi Log gibt auch keinen Aufschluss über das Problem. Starte ich Kodi per normalem Start Script oder direkt auf der Konsole funktioniert es einwandfrei.


    Hatte schon die Vermutung das ich irgendwelche ENVVARS vor "popen" definieren muss, die Suche im Netz blieb aber leider bis jetzt erfolglos.


    Vielleicht kann mir hier ja jemand den entscheidenden Tip geben.

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

    Einmal editiert, zuletzt von vectra130 ()

  • Wenn Du nur Programme starten und nichts an die neu gestarteten Programme streamen musst, schau dir mal die exec() Funktionenfamilie an:
    https://linux.die.net/man/3/execvp


    Damit kannst Du die Environment-Variablen sehr detailiert steuern.


    Viel Erfolg
    Christian

  • Hi Christian.
    So hatte ich es anfangs gemacht. Da hatte ich aber auch irgendein anderes Problem. Weiß gerade nicht mehr was es genau war. Ist schon länger her. Werde es mir aber nochmal ansehen.
    Danke dir

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

  • Welches init-System nutzt du denn? Vielleicht ist es einfacber, die Programme darüber starten zu lassen.
    Dann musst du mit popen oder exec nur den passenden Startbefehl absetzen, den Rest macht dann das init-System.


    Lars

  • Auf die Idee kam ich gestern auch ;)
    Hab mir ein kodi.service angelegt. Aber genau das selbe Ergebnis.
    Ich verstehe es nur nicht. Hab dieses Mysterium nur wenn ich Kodi über mein Programm ausführe. Sonst konnte ich es noch nicht reproduzieren.
    Mir fällt aber auch leider sonst nichts ein wie ich es noch umgehen könnte.

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

  • Mir ist gestern noch was aufgefallen was ich die ganze zeit übersehen hatte.
    Und zwar tritt das Problem NUR auf wenn ich mein Programm per Systemd Skript starte. Muss also irgendwie mit systemd zusammen hängen.
    Ich könnte jetzt zwar hingehen und mein Programm anders starten, aber das ist ja nicht im Sinne des Erfinders.


    Kann sich mal jemand mein Skript ansehen. Vielleicht findet ja jemand nen Fehler. Hab mich noch nie tiefer damit befasst und es mir nur "zusammengestrickt".

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

  • Um das sinnvoll einordnen zu können, wäre es wichtig zu wissen, wie sich das Programm verhält - RemainAfterExit macht z.B. eigentlich nur Sinn, wenn der Unit-Type oneshot ist und ExitStop ist komisch, weil Systemd standardmäßig sowieso ein SIGTERM sendet (was du aus irgendeinem Grund abgeschaltet hast).


    Ansonsten schau dir doch mal mit env die Umgebungsvariablen in deiner Shell-Sitzung und der Systemd-Unit an und hänge dich mit gdb an ein laufendes, durch dein Skript bzw. eine Systemd-Unit gestartetes KODI ( https://www.chemie.fu-berlin.d…info/gdb/gdb_5.html#SEC22 ), um an einen Backtrace nach dem provozierten Crash zu kommen.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Wenn dein Programm ein "systemctl start kodi" absetzt, sollte Kodi eigentlich genauso laufen, als wenn du es über die Shell startest. Irgendein Puzzleteil fehlt da noch.


    Lars

  • Könnte mir jemand nen Vorschlag machen wie mein Init Skript aussehen müsste?
    Ich kann mein Programm normal, oder als Daemon starten (mit -d). Weiß aber nicht was für das Skript sinnvoller wäre.
    Ich habe auch herausgefunden, das wenn sich das Prog beendet (zB durch Segfault), dann muss ich das Init Skript erst nochmal "stoppen" bevor ich es wieder starten kann. Hängt wohl alles mit dem zusammengewürfelten zusammen. Vielleicht behebt sich ja mein eigentliches Problem dann auch ganz von selbst wenn das Init Skript richtig konfiguriert ist.

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

  • Bei systemd ist es sinnvoll, dass das zu startende Programm nicht forked, also einfach losläuft. Alle Ausgaben über stdout werden dann im journal gesammelt. Und es sollte einen Signalhandler für TERM haben, bei dem es sich ordnungsgemäß beendet. Dann reicht eigentlich die ExecStart-Zeile.


    Lars

  • Wenn sich das Programm "normal" verhält, dann sollte es so genügen - zu Risiken und Nebenwirkungen einfach mal die Systemd-Dokumentation lesen ;)

    Ich weiß ja nicht, welche Distribution und welche Methode du nutzt, um das Netzwerk zu konfigurieren, aber schau dir mal das network-online.target an, wenn du auf eine funktionierende Netzwerkverbindung warten willst.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Danke euch zwei.
    Werde es die Tage mal ausprobieren.

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

  • Das Init Skript funktioniert zwar jetzt so wie es soll, jedoch bleibt mein eigentliches Problem bestehen.
    Werde mich jetzt wie vorgeschlagen mam mit gdb an das laufende Kodi hängen (versuche es auf jeden Fall) und poste mal den backtrace. Vielleicht findet sich ja dann das "fehlende Puzzleteil"

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

  • So. Hab das Problem lösen können. Falls es jemanden Interessiert oder es jemand auch mal braucht:


    Habe

    Code
    Environment=HOME=/root

    in das Init Script eingefügt und jetzt klappts auch mit der Dateiauswahl wieder :)

    Gruß Patrick


    [size=8]* Meine NeverEndingProjects ;) *


    vectra --- glasslike ---

  • Na ja, streng genommen ist das keine Lösung. Man compiliert nicht unter root, mit einem anderen User wäre es wohl auch gar nicht zu dem Problem gekommen.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Ob man als root compiliert oder nicht dürfte keinerlei Unterschied machen, eher als welcher Nutzer man etwas startet.

  • Ob man als root compiliert oder nicht dürfte keinerlei Unterschied machen, eher als welcher Nutzer man etwas startet.


    Eben nicht, auf vielen Systemen ist z.B. HOME für root nicht gesetzt. Auch sonst unterscheidet sich das Environment oft. Typisches Beispiel ist auch /etc/profiles welches nur durch einen Eingriff auch für root gilt.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Die environment settings werden nicht einkompiliert, sonst bräuchte man die doch nicht..

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!