Perl Skirpt funktioniert nicht von der commands.conf

  • Hoi !


    ich sitze jetzt seit 2 Tagen dran, das angehängte Perl-Skript zum Laufen zu bringen (Dateiendung wegen Forum-Restriktionen geändert). :rolleyes:


    Von der Shell aus funktioniert es ganz hervorragend und ohne Probleme. :]
    Das Ganze Skript dient zur MP3-Erzeugung von einer eingelegten CD.
    Normalerweise holt der Rechner sich die CDDB-Daten, rippt und encoded und erstellt noch ein M3U-File.


    Führe ich das Ganze in VDR via commands.conf aus, passiert genau gar nix. Keine Ausgabe der Console im OSD, nix. ;(
    Es wäre nett, wenn sich jemand, der sich ein wenig mit dem Implementieren von Skripten auskennt, mal in's Skript reinsieht und evtl. den Fehler findet.


    Oder ist es etwa gar nicht möglich, so ein Perl-Skript von der commands.conf aus auszuführen ? ?(

    Dateien

    VDR1: Athlon XP@1200+, DVB-S FF1.6 + Nova, 112W Netzteil, Atric IR Einschalter
    VDR2: Celeron 533, DXR3, 2 x Skystar, Atric IR Einschalter
    jeweils Mahlzeit 3.2 + Toxic 1.4.7 (Extp. 34)
    ...seit vdr-1.0.3 dabei. Boah ist das geil geworden. :D

  • Hi,


    da der interpreteter in der Magic Line steht ist es eigentlich egal wie es aufgerufen wird. Hauptsache das x flag ist gesetzt.


    Poste am besten noch die Zeile aus der commands.conf. Ich schaue es mir dann an wenn ich wieder am Rechner bin.


    Gruss
    Dimitri

  • Hi,


    probier mal, beim Aufruf der Programme (wie lame usw.)
    absolute Dateinamen zu verwenden (z.B. /usr/local/bin/lame)
    bzw. den PATH entsprechend zu setzen.


    Ja nachdem, von wo vdr aufgerufen wird, ist wahrscheinlich die PATH-Variable nicht ordentlich gesetzt.


    Gruß


    Chucky

  • Hi !


    Schon mal ein Danke für die Antworten. :)


    dimitri:

    Zitat

    Poste am besten noch die Zeile aus der commands.conf. Ich schaue es mir dann an wenn ich wieder am Rechner bin.


    CD konvertieren: /usr/local/src/tools/ripit-2.0/ripit.pl


    Chucky:

    Zitat

    Hi,


    probier mal, beim Aufruf der Programme (wie lame usw.)
    absolute Dateinamen zu verwenden (z.B. /usr/local/bin/lame)
    bzw. den PATH entsprechend zu setzen.


    Ja nachdem, von wo vdr aufgerufen wird, ist wahrscheinlich die PATH-Variable nicht ordentlich gesetzt.


    Du meinst, daß ich im Skript anstatt z.B.


    dagrab -d $cddev -v $cdopt -f \"$riptrackname.rip\ " usw


    /usr/bin/dagrab..... usw schreiben sollte ?


    Was Du mit dem PATH meinst, verstehe ich nicht, da ich leider außer der VDR-Geschichte noch Linux-Noob bin. 8)

    VDR1: Athlon XP@1200+, DVB-S FF1.6 + Nova, 112W Netzteil, Atric IR Einschalter
    VDR2: Celeron 533, DXR3, 2 x Skystar, Atric IR Einschalter
    jeweils Mahlzeit 3.2 + Toxic 1.4.7 (Extp. 34)
    ...seit vdr-1.0.3 dabei. Boah ist das geil geworden. :D

    Einmal editiert, zuletzt von Boergen ()


  • Ja.


    Zitat

    Original von Boergen
    Was Du mit dem PATH meinst, verstehe ich nicht, da ich leider außer der VDR-Geschichte noch Linux-Noob bin. 8)


    PATH ist eine Umgebungsvariable, in der die einzelnen Verzeichnisse gespeichert sind, in denen die zu startenden Programme gesucht sind.


    Sie wird meist ein einen Startup-Skript für die Shell gesetzt, so dass, falls vdr nicht von der Shell, sondern zum Beispiel von inittab aus gestartet wird, nicht die gewohnten Verzeichnisse im PATH sind, und somit die Programme nicht gefunden werden.


    So kannst du alternativ zum Benutzen der absoluten Dateinamen den PATH innerhalb des Perl-Skriptes setzen


    Hierzu kann du in der Shell mal mit

    Code
    echo $PATH

    dir die aktuelle PATH-Definition mal anzeigen lassen und innerhalb des Perl-Skriptes mit

    Code
    $ENV{PATH}="...";

    auf den entsprechenden Wert setzen.


    Alternativ zum Setzen des kompletten PATH kann auch mit

    Code
    '$ENV{PATH}.=":/usr/local/bin" ;


    nur die benötigten Verzeichnisse anfügt werden (Mehrere Verz. durch : trennen).



    Hope this helps


    Chucky

  • Boah. :P


    Das mit dem PATH haut hin ! :] DANKE !


    Jetzt gibt's nur noch ein mittleres Problem:


    Wenn ich in VDR nun den Befehl aufrufe, bleibt unten im OSD "CD konvertieren..." stehen und er ist fleißig am Rippen und encoden. Wie bekomme ich es hin, daß er die Sachen, die er dabei normalerweise ausgibt, auf das OSD bringt ?

    VDR1: Athlon XP@1200+, DVB-S FF1.6 + Nova, 112W Netzteil, Atric IR Einschalter
    VDR2: Celeron 533, DXR3, 2 x Skystar, Atric IR Einschalter
    jeweils Mahlzeit 3.2 + Toxic 1.4.7 (Extp. 34)
    ...seit vdr-1.0.3 dabei. Boah ist das geil geworden. :D

  • Mist !
    Der Watchdog macht mir nen Strich durch die Rechnung. Das Rippen und Encoden funzt wunderbar, aber nach 60 Sekunden restartet VDR neu.
    Was nun ? ;(

    VDR1: Athlon XP@1200+, DVB-S FF1.6 + Nova, 112W Netzteil, Atric IR Einschalter
    VDR2: Celeron 533, DXR3, 2 x Skystar, Atric IR Einschalter
    jeweils Mahlzeit 3.2 + Toxic 1.4.7 (Extp. 34)
    ...seit vdr-1.0.3 dabei. Boah ist das geil geworden. :D

  • Zitat

    Original von Boergen
    Mist !
    Der Watchdog macht mir nen Strich durch die Rechnung. Das Rippen und Encoden funzt wunderbar, aber nach 60 Sekunden restartet VDR neu.
    Was nun ? ;(


    Das Skript im Hintergrund starten. Dadurch ist aber keine Statusausgabe vom Skript mehr möglich.


    Zur Realisierung folgende zwei Varianten:

    • in der commands.conf dem Kommando ein & anfügen.
      Ich weiß aber nicht genau ob dies funktioniert, da ich nicht genau weis, wie dieser Eintrag interpretiert wird.
      (Das & ist ein Zeichen für die Shell den Prozess im Hintergrund laufen zu lassen, Klappt aber nur, wenn der Eintrag direkt durch die Shell interpretiert wird)


    • Im Perl-Skript ziemlich am Anfang ein

      Code
      if (fork>0) { exit; }


      einfügen. Hierdurch erzeugt der Perl-Prozeß eine Kopie von sich und beendet den einen (Eltern-)Prozeß. während der im Hintergrund weiterläuft.


    Gruß


    Chucky

  • Hi !


    Leider klappen die beiden Tips nicht.
    Was macht denn das "if fork > 0" vor dem "exit;" ? Kann man das weglassen ? Vielleicht tritt der Fall "fork > 0" beim Skript nie ein... :rolleyes:

    VDR1: Athlon XP@1200+, DVB-S FF1.6 + Nova, 112W Netzteil, Atric IR Einschalter
    VDR2: Celeron 533, DXR3, 2 x Skystar, Atric IR Einschalter
    jeweils Mahlzeit 3.2 + Toxic 1.4.7 (Extp. 34)
    ...seit vdr-1.0.3 dabei. Boah ist das geil geworden. :D

  • Zitat

    Original von Boergen
    Hi !


    Leider klappen die beiden Tips nicht.
    Was macht denn das "if fork > 0" vor dem "exit;" ? Kann man das weglassen ? Vielleicht tritt der Fall "fork > 0" beim Skript nie ein... :rolleyes:



    Schade. :(


    Das fork bewirkt eine "Verdoppelung" des aktuellen Prozesses, so das nach den fork-Aufruf zwei identische Prozesse existieren.


    Der eine Prozess (der neu erzeugte Prozess) liefert 0 zurück und der andere (der originale Prozess) liefert die ID des neuen Prozesses zurück. Das if (fork>0) { exit; } bewirkt daher, das ein neuer Prozess erzeugt und der originale Prozess beendet wird. Daher ist das Programm aus Sicht von vdr schon beendet, und im Hintergrund läuft die Kopie weiter und sollte rippen (Das war jedenfalls die Theorie :-()


    Funktioniert das modifizierte Perl-Skript auf der Kommandozeile?


    Chucky

  • Zitat

    Funktioniert das modifizierte Perl-Skript auf der Kommandozeile?


    Ja, funktioniert problemlos. Es wird sogar, wie von Dir gedacht, in den Hintergrund geschickt.

    VDR1: Athlon XP@1200+, DVB-S FF1.6 + Nova, 112W Netzteil, Atric IR Einschalter
    VDR2: Celeron 533, DXR3, 2 x Skystar, Atric IR Einschalter
    jeweils Mahlzeit 3.2 + Toxic 1.4.7 (Extp. 34)
    ...seit vdr-1.0.3 dabei. Boah ist das geil geworden. :D

  • Zitat

    Original von Boergen


    Ja, funktioniert problemlos. Es wird sogar, wie von Dir gedacht, in den Hintergrund geschickt.


    Dann probier nochmal folgende Zeilen vor dem fork einzufügen:

    Code
    open STDIN,"</dev/null";
    open STDOUT,">/dev/null";
    open STDERR,">/dev/null";
    $SIG{PIPE} = 'IGNORE';


    Wenn vdr die Ausgaben des original-Programms umlenkt, nach dem Aufruf des Programms die Filedescriptoren schließt und das Skript versucht auf diese Descriptoren schreibt, ist es möglich das das Programm abgeschossen wird.


    Durch den obigen Code werden die Ausgaben auf /dev/null umgeleitet, und auch verhindert, das das Programm gekillt wird.


    Wenn dies auch nicht hillft, dann weis ich auch nicht weiter :(


    Have fun
    Chucky

  • Aha. Das brachte uns jetzt schon mal einen Schritt weiter. ;)


    Wenn man es jetzt aufruft, dann geht das alles komplett in den Hintergrund und läuft da weiter.
    Nun kriegt VDR aber die Krise, was wahrscheinlich mit den Umleitungen auf /dev/null zu tun hat:



    ...und so weiter. Das Resultat ist, daß ich keine Channel mehr anzappen kann. Das OSD funktioniert aber noch.

    VDR1: Athlon XP@1200+, DVB-S FF1.6 + Nova, 112W Netzteil, Atric IR Einschalter
    VDR2: Celeron 533, DXR3, 2 x Skystar, Atric IR Einschalter
    jeweils Mahlzeit 3.2 + Toxic 1.4.7 (Extp. 34)
    ...seit vdr-1.0.3 dabei. Boah ist das geil geworden. :D

  • Zitat

    Original von Boergen
    Aha. Das brachte uns jetzt schon mal einen Schritt weiter. ;)


    Wenn man es jetzt aufruft, dann geht das alles komplett in den Hintergrund und läuft da weiter.
    Nun kriegt VDR aber die Krise, was wahrscheinlich mit den Umleitungen auf /dev/null zu tun hat:


    Kann ich mir eigentlich nicht vorstellen, da Umleitung nur für den aktuellen Prozeß und den von ihn erstellten Prozeßen gültig sein dürften.
    Du könntest aber mal probieren die 3 open- Befehle wieder rauszunehmen und nur das $SIG{PIPE} = 'IGNORE'; drinläßt.
    Dadurch sollte eigentlich auch das Abschießen des Prozesses verhindert werden.


    Alternativ kannst du nach mal probieren die Zeile mit den fork vor den open-Befehlen zu verschieben.


    Zitat

    Original von Boergen


    ...und so weiter. Das Resultat ist, daß ich keine Channel mehr anzappen kann. Das OSD funktioniert aber noch.


    Tja, da kann ich erstmal auch nicht weiterhelfen.
    Tritt dies auch auf, wenn dies das Skript per Hand (also nicht vom vdr aus) startest?



    Gruß Chucky

  • Hallo
    Es gibt noch ne Moeglichkeit den prozess zu starten und zwar mit:
    CD konvertieren: at -f /usr/local/src/tools/ripit-2.0/ripit.pl now
    Im perl script koenntest du dann mittels svdrpsend MESG ausgaben an vdr schicken.
    Gruss
    HelAu

  • Hi,


    ich kann dir nur raten das ganze etwas zu verändern.


    Schreib dir ein kleines script ala wait2enc.sh und prüfe dort auf vorhandensein einer resource. Damit ist ein file gemeint das du per vdr kommands einfach mit touch erzeugen lässt.


    Das script sollte dann in einem interval prüfen ob die Datei da ist.


    Wenn dem so ist startet es dein script und löscht im anschluss die resource.


    Meldungen kannst du dann wie helau schon sagte per svdrpsend zu vdr schicken.


    Gruss
    Dimitri

  • Hallo,


    starten kann man das auch mit :


    CD konvertieren: nohup /usr/local/src/tools/ripit-2.0/ripit.pl &


    Erzeugt eine datei nohup.out in dem Verzeichnis wo man "steht" mit der ausgabe des scripts. So das man in dem Script am besten die Ausgabe in eine Datei umleitet.


    wenn man parameter an das Script übergeben möchte oder den output umleiten möchte dann ist dies auch "gut" :


    CD konvertieren: echo "/usr/local/src/tools/ripit-2.0/ripit.pl A B C >/var/log/ripti.log 2>&1"|at now


    Bitte beachtet die anführungszeichen !!!


    Dies alles bedingt aber das der User unter dem VDR läuft auch die berechtigungen hat das zu tun was man möchte.


    Der Ansatz von Dimitri kann, wenn man das wünscht, auch mit root rechten laufen so das es da mehr möglichkeiten gibt ;)


    Viel spaß
    Viking

  • Ooohh.. Das hört sich ja jetzt alles gar nicht mal schlecht an. :)
    Ich werd's mal austesten, wenn ich wieder zuhause bin. :]

    VDR1: Athlon XP@1200+, DVB-S FF1.6 + Nova, 112W Netzteil, Atric IR Einschalter
    VDR2: Celeron 533, DXR3, 2 x Skystar, Atric IR Einschalter
    jeweils Mahlzeit 3.2 + Toxic 1.4.7 (Extp. 34)
    ...seit vdr-1.0.3 dabei. Boah ist das geil geworden. :D

Jetzt mitmachen!

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