ffplay aus crontab funktioniert nicht

  • Hallo zusammen

    vielleicht kann mir jemand mit folgendem Problem helfen - die Suche in den Foren oder heftiges googeln hat mir leider bislang nicht geholfen.

    Meine Konfiguration

    Raspberry Pi 3 Model B Plus Rev 1.3

    Raspbian GNU/Linux 11 (bullseye)

    IP Kamera zur "Überwachung" unseres Schildkrötengeheges :) Jaja, wozu man Raspis so alles gebrauchen kann...

    Vor dem Upgrade auf Bullseye habe ich omxplayer genutzt, um einen Videostream auf einen angeschlossenen HDMI-Monitor dazustellen. Klappte flott und problemlos.

    Der omxplayer wurde über einen cron-Jon automatisch alle Stunden gekillt/neugestartet, weil die Netzwerkverbindung in den Garten manchmal hakelt.

    Jetzt Upgrade auf Bullseye.

    Bullseye und omxplayer vertragen sich aber nicht. VLC als Alternative ruckelt arg, also möchte ich ffplay nutzen.

    Der folgende Befehl von der Kommandozeile ausgeführt klappt problemlos (natürlich mit richtigem User/Password)

    Code
    ffplay rtsp://abc:abcdefg@192.168.21.120:554/stream1

    Auf dem Desktop liegt eine Textdatei namens Kamera_Autom_Restart.sh mit folgendem Inhalt

    Bash
    #!/bin/bash
    killall -15 ffplay
    ffplay rtsp://abc:abcdefg@192.168.21.120:554/stream1 2>&1 >/home/pi/Desktop/cron.log

    Per Doppelklick auf diese Datei läuft auch alles wie gewünscht, das log file ist leer.

    Wenn ich das aber jetzt in einen cronjob packen will gehe ich wie folgt vor:

    Code
    sudo crontab -e

    Dort steht (nur testweise "jede Minute")

    Code
    */1 * * * * /bin/sh /home/pi/Desktop/Kamera_Autom_Restart.sh

    (Ich nutze den system-crontab, da es auch nach einem Neustart des Raspi ohne angemeldeten User funktionieren soll)

    Und dann erscheint kein Bild und im Logfile steht

    The path /dev/dri/ cannot be opened or is not available

    The path /dev/dri/ cannot be opened or is not available

    Irgendwas scheint also mit dem Output nicht zu funktionieren. Im angemeldeten Benutzer musste ich mal

    Code
    export DISPLAY=:0.0

    ausführen, danach funktionierte es dann. Fehlt so was auch im "root"-User oder muss ich was anderes machen.

    Danke für Eure Hilfe !

    Gruß

    Frank

  • Zur hilfreichsten Antwort springen
  • Whoami (who-am-i))

    Wenn Du mit sudo crontab -e einen crontab Eintrag erstellst, geschieht dies in der crontab des Users root.

    Ohne sudo in der crontab des angemeldeten Users (pi ). Dort gehört Dein Eintrag hin, wenn Dein Sript im Terminal des Grafiksystem des Users pi funktioniert.

    Der User root hat meistens gar kein Grafiksystem und wird auch nicht automatisch am System angemeldet.

    Servus !

    RTFM = Read The Factory Manual, oder so

    • Hilfreichste Antwort

    */1 * * * * DISPLAY=:0 /bin/sh /home/pi/Desktop/Kamera_Autom_Restart.sh

    Aufrufe dieser Art in der Crontab sind einfach nur ... Pfusch.

    (Ein Skript mit der DASH aufrufen, obwohl in dem Skript im Shebang die bash steht, die, da der Aufruf anders erfolgt, nicht benutzt wird, ist eine weitere Sache)

    In der crontab ruft man ein Programm auf und leitet diese Aufruf-Meldungen gegebenenfalls in Logdateien um.

    Man schreibt dort aber keine Befehlsfolgen hin. (Auch weil es unübersichtlich ist)

    Trägt man in die Crontab ein Skript, dann macht man dieses Skript ausführbar, gibt es spezielle Aufrufe für die in dem Skript ausgeführten Programme, dann setzt man diese in diesem Skript.

    Auch, damit, wenn man das Skript alleine aufruft, die komplette Umgebung richtig gesetzt wird.

    Also wäre der Aufruf dieser crontab-Zeile:

    Code
    */1 * * * * /home/pi/Desktop/Kamera_Autom_Restart.sh

    Das Skript hatte für den Benutzer, der es aufrufen soll, Ausführungsrechte, und in dem Skript wäre die Zeile

    DISPLAY=:0

    enthalten:

    Bash
    #!/bin/bash 
    killall -15 ffplay
    export DISPLAY=:0
    ffplay rtsp://abc:abcdefg@192.168.21.120:554/stream1 2>&1 >/home/pi/Desktop/cron.log

    (ob das wirklich auf dem Desktop liegen sollte, .......)

    Computer ..... grrrrrr

  • Aufrufe dieser Art in der Crontab sind einfach nur ... Pfusch.

    Dann begründe diese IMHO provokante Aussage bitte konkret! Dash vs. Bash wäre eine mögliche Ursach das es nicht funktioniert, aber die Aussage "Pfusch" ist schon eine Hausnummer. :no_sad:

    Dort stand nur Ausgabeort, Interpreter und Skriptpfad. Was soll daran bitte Pfusch sein? :-/

  • Warum soll z. B. die Umgebungsvariable DISPLAY (oder eine andere) bei jedem Aufruf immer wieder gesetzt werden (... da es hier doch nicht um eine "spezielle Umgebungsvariable" geht, die gesetzt sein sollte)?

    Dass das Script, wenn es allein aufgerufen wird, funktioniert hat, hat der TE doch schon in seinem 1. beitrag mitgeteilt:

    Code
    Per Doppelklick auf diese Datei läuft auch alles wie gewünscht

    , weil die Variable für seine benutzte shell, global gesetzt ist. Siehe die Ausgabe von:

    Code
    echo $DISPLAY

    Da das in der crontab nicht der Fall ist, kann man dort vor den Zeilen mit den Befehlen, u. a. auch (einmal) die Umgebungsvariable:

    Code
    DISPLAY=:0

    setzen. Jeder Befehl/Script in dieser crontab, hat dann Zugang zu dieser gesetzten Umgebungsvariable.

    Das kann man sich _temporär_ auch mit bzw. aus der jeweiligen crontab heraus anzeigen lassen, mit z. B. der command-Zeile:

    Code
    * *    * * *    logger "`echo $DISPLAY`"

    Die Ausgabe im syslog (oder gleichwertig) sollte dann so ähnlich sein:

    Code
    Sep 17 09:35:01 ###### user.notice logger: :0

    EDIT:

    BTW: Wer libnotify-bin auf dem PI installiert hat, kann auch mit dem einfachen Script:

    Spoiler anzeigen
    Bash
    #!/bin/bash -e
    #
    /usr/bin/notify-send 'Mitteilung:' "`echo $DISPLAY`" \
        -u normal --icon=dialog-information
    #
    exit 0

    , aus der crontab und mit der Kommandozeile, testen.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

    Einmal editiert, zuletzt von rpi444 (17. September 2022 um 09:52)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!