[gelöst] stdin eines Shell Script an einen anderen Process weiterleiten?

  • Hallo,


    ich habe noch nicht mal ansatzweise eine Ahnung wo ich da suchen soll. Es geht um die Einbindung von Freevo in den VDR mittels dem externalplayer Plugins. Das externalplayer Plugin startet ein Wrapper Shell Script, dieses startet dann freevo.
    Nun gehen im slave Mode die Fernbedinungskommandos als Tastatureingaben in das Wrapper Shell Script. Ziel ist es die von dort nach Freevo umzuleiten so das er sie als Tastatureingaben sieht.


    Geht das irgendwie? Die Alternative wäre das externalplayer Plugin umzuschreiben so das es die Kommandos per UDP an Freevo sendet (da gibts nen Freevo Plugin um die zu empfangen). Aber das übersteigt meine Fähigkeiten bei weitem.


    Der relevante code im externalplayer ist


    und


    Code
    string * key = config->keys->vdrKeyBack;
              if (key != NULL) {
                write(fdWritePipe, key->c_str(), key->size());
              }


    Und ich denke ich habe die Funktionsweise wohl richtig verstanden.



    Hat da evtl. jemadn hilfreiche Tipps?


    cu

  • ich habe noch nicht mal ansatzweise eine Ahnung wo ich da suchen soll.

    man 1 sh
    (der Abschnitt über Redirection)


    Das externalplayer Plugin startet ein Wrapper Shell Script, dieses startet dann freevo.
    Nun gehen im slave Mode die Fernbedinungskommandos als Tastatureingaben in das Wrapper Shell Script. Ziel ist es die von dort nach Freevo umzuleiten so das er sie als Tastatureingaben sieht.

    Eigentlich ist das doch gerade das Standardverhalten. Wenn ich z.B. in einem Shell-Skript cat oder tee aufrufe, wird die Standardeingabe weitergegeben, ohne dass ich noch irgendetwas machen müsste.


    string * key = config->keys->vdrKeyBack;
    if (key != NULL) {
    write(fdWritePipe, key->c_str(), key->size());
    }

    Könnte es sein, dass der andere Prozess zeilengepuffert liest und daher noch auf einen Zeilenumbruch wartet, der aber nie kommt?

    Give root password for maintenance (or type Control-D to continue): _

  • Eigentlich ist das doch gerade das Standardverhalten. Wenn ich z.B. in einem Shell-Skript cat oder tee aufrufe, wird die Standardeingabe weitergegeben, ohne dass ich noch irgendetwas machen müsste.


    Ja, eigentlich schon. Aber es wird ja das Shell Script gestartet, das startet ein zweites welches ein Python Script aufruft. Und ich denke irgendwo koppelt sich da was ab. Des weiteren laufen beide (also VDR und Freevo) über DirectFB, und da spielt ja dessen Tastaturinputmodul auch noch irgendwie rein (der VDR braucht es nicht aber Freevo braucht das aktiviert). Irgendwie alle sehr unübersichtlich.
    (Aber die Tastatursteuerung ansich (also drücken auf der richtigen Tastatur) geht in Freevo und in VDR)


    Ich dachte ehe irgendwie an eine Möglichkeit per Shell Zeichen an stdin beliebiger Prozesse zu senden (irgendwo in /proc/<irgendwas schreiben> oder irgendein unbekanntes Standarttool was es für sowas gibt).
    Schon um das überhaupt erstmal auszuprobieren. Weil im Moment weiss ich auch überhaupt nicht ob Freevo überhaupt auf stdin reagiert oder ob es die Tastatur irgendwie anderst abfragt.


    Könnte es sein, dass der andere Prozess zeilengepuffert liest und daher noch auf einen Zeilenumbruch wartet, der aber nie kommt?


    Eigentlich nicht, das Programm steuert sich ja ganz normal über Tastatur, d.h. "h" sollte die Tastaturhilfe aufrufen.


    cu

  • Schau Dir doch wenn möglich das /_config/bin/switch_console.sh Script von gen2vdr an.
    damit hat HelAu schon seit Ewigkeiten den Wechsel zwischen Freevo und VDR möglich gemacht.
    Schaltet dann Bild/Ton/FB um also bedient man nicht aus Versehen noch den VDR obwohl man Freevo sieht. :)


    Gruß N!ce


    so hier haben wir noch eins gefunden auf der SMT :]

  • Ich dachte halt zuerst an ein Synchronisationsproblem, also dass die Eingabe noch in irgendeinem Puffer festhängt. Bei fwrite() hätte noch ein fflush() gefehlt, aber wenn ich die Doku richtig verstehe, ist so etwas bei write() unnötig.


    Ich nehme an, dass du den Prozess selber startest? Dann kannst du zum Testen beim Start den Inhalt von stdin übergeben. Beispiel: cat <<< "Hallo, Welt!"


    Es könnte auch sein, dass ein anderer Prozess stdin "wegschnappt", so dass für den eigentlichen Empfänger nichts mehr übrig bleibt. Dann könntest du (sofern du nicht jeden Prozess einzeln mit </dev/null füttern willst), stdin umbenennen:

    Bash
    #!/bin/sh
    # Ursprüngliches stdin im fd9 speichern und dann durch null ersetzen
    exec 9<&0 0</dev/null
    ...
    # Ursprüngliches stdin als Eingabe verwenden
    /usr/bin/foobar <&9


    (So ungefähr jedenfalls ;))

    Give root password for maintenance (or type Control-D to continue): _

  • Schau Dir doch wenn möglich das /_config/bin/switch_console.sh Script von gen2vdr an.
    damit hat HelAu schon seit Ewigkeiten den Wechsel zwischen Freevo und VDR möglich gemacht.
    Schaltet dann Bild/Ton/FB um also bedient man nicht aus Versehen noch den VDR obwohl man Freevo sieht. :)


    Aber genau das (VDR bedienen obwohl man Freevo sieht) will ich ja ;)


    VDR krallt sich den Video- und den OSD Layer. Freevo kennt nur den Videolayer. Starte ich Freevo dann supendet der VDR den Output im Videolayer und Freevo bekommt den. Als Ergebnis habe ich Freevo (anstelle des TV Bildes) aber der VDR liegt mit seinem OSD drüber. D.h. ich bin in Freevo aber habe immer noch mein VDR OSD.
    Das einzige Problem ist das Freevo mitreagiert wenn ich im VDR OSD navigiere. Aber das Problem löst sich ja wenn das mit den Slave Mode der FB funktioniert.


    so hier haben wir noch eins gefunden auf der SMT :]


    Danke, aber halt leider nicht das was ich erreichen will. Diese Umschalterei mag ich irgendwie nicht.


    tag: Danke, probiere ich nachher mal aus.


    cu

  • Das einzige Problem ist das Freevo mitreagiert wenn ich im VDR OSD navigiere. Aber das Problem löst sich ja wenn das mit den Slave Mode der FB funktioniert.


    Oder beim starten von Freevo die FB für den VDR ausschalten:


    Code
    svdrpsend.pl HELP REMO 
    214-REMO [ on | off ]
    214-	Turns the remote control on or off. Without a parameter, the current
    214-	status of the remote control is reported.


    Gruß,
    Chuck

    1- yavdr 0.5 - DVB-C
    1- VDR-1.7.14 - Xine Pugin - XBMC - DVB-C
    2- Activy 300 mit Gen2VDR V2


  • Oder beim starten von Freevo die FB für den VDR ausschalten:


    Genau das möchte ich ja nicht, weil dann kann ich den VDR ja nicht mehr bedienen wenn Freevo läuft. Ich möchte aber z.B. auch gerne mal die "neue Mail" Message vom Mailbox Plugin sehen (und dann evtl. mal in die Mailbox schauen) während in Freevo nen Film läuft.


    Man könnte auch per lircrc ne Umschalttaste definieren, so das Frevo und VDR auf unterschiedliche Tastenebenen reagieren, aber auch das wäre unschön.



    Eigentlich haperts ja nicht an viel, es ist ja nur ne Kleinigkeit. Und wenn das hier nicht klappt dann modifiziere ich halt das externalplayer Plugin so das es Netcat aufruft um dann die Tastendrücke per UDP an Freevo zu senden. Ich will schon länger mal nen Mediacenter im VDR, da gebe ich jetzt nicht so schnell auf ;)


    cu

  • OK, falls mal jemand mit der suche hierauf stöst...


    Ich habe jetzt ein Pythion Wrapper Script was ich dazu nutze Freevo per externalplayer zu starten.
    Dieses schaltet per dbus2vdr Plugin das Display beim GraphLCD Plugin ab, startet LCDd, startet Freevo und wartet dann auf die Tastendrücke die vom externalplayer Plugin kommen (slave Mode). Diese Tastendrücke sendet es dann per TCP zu Freevo weiter (Freevo hat dafür nen eigegebauten TCP Server).


    Bekommt es das SIGTERM Signal vom externalplayer Plugin beendet es Freevo, den LCDd und schaltet GraphLCD wieder an.


    Das scheint soweit gut zu funktionieren.


    Die externalplayer.conf sieht dann ungefähr so aus (Fernbedienung noch nciht konfiguriert):

    Code
    {
      MenuEntry        = "freevo";
      Command          = "/usr/local/sbin/vdr-freevo";
      OutputMode       = extern;
      InputMode        = slave;
      vdrKey1          = "a";
      vdrKey2          = "b";
    }


    Der externalplayer braucht noch nen Patch (hier im Forum zu finden) damit keine Zombie Processe zurückbleiben (ist abe rein genereller Bug im Plugin).


    cu

Jetzt mitmachen!

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