Hintergrund-Skript stoppt nach einiger zeit

  • Hey Leute!


    Da sich die externen Lautsprecher für meinen TV nicht automatisch einschalten (automatisches Ausschalten funktioniert), wenn ich meinen TV einschalte, habe ich für meinen Raspi Zero ein Skript geschrieben, das in einer Endlosschleife per HDMI-CEC den Power-Status des TV abfragt. Wenn sich dieser ändert wird mithilfe von LIRC ein Infrarotkommando über einen dranhängenden IR-Blaster gesendet, der die Boxen einschaltet. Funktioniert alles super, nur wenn ich das Skript als Autostart (wird in init.d gestartet) im Hintergrund starten lasse, läuft das Skript immer nur einige Minuten und dann nicht mehr. Wenn ich es jedoch aktiv über SSH starte, läuft es immer weiter, so lang ich eben mit Putty draufbleibe. Hat jemand ne Idee, warum das Skript, wenn es im Hintergrund läuft, nicht endlos weiterläuft?


    Das Skript ist im Anhang. Als OS wird Raspbian Jessie verwendet (die LIRC-Version für neuere Rasbpian-OS ist Schrott, aber da der Zero im Endeffekt nur diese Sache machen soll und auch nicht im Netz hängt ist das kein Problem).


    Danke für eure Hilfe

  • Möglicherweise reicht es schon, wenn Du irsend mit dem absoluten Pfad in Dein Script aufnimmst.


    Sonst schau in den Logfiles nach.




    Servus !

    RTFM = Read The Factory Manual, oder so

  • In den Files, die unter < ls -al /var/log > angezeigt werden. syslog, kern.log wäre da ein allfälliger Kandidat für Dich.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Habe zwar kein Raspbian sondern Manjaro am Laufen, sollte aber ähnlich sein.

    So wie es mir scheint, findet systemd die audioswitch.service nicht und bricht das Script deswegen ab.

    Anstatt es in /etc/init.d/ zu verschieben oder zu verlinken, kannst Du das Script direkt mit systemd starten lassen.

    Dafür legst Du die Datei audioswitch.service im Verzeichnis /usr/lib/systemd/system/ an:

    sudo nano /usr/lib/systemd/system/audioswitch.service

    (Anstelle von nano kann natürlich auch "vim" oder "cat >" stehen.)

    mit folgendem Inhalt:

    Code
    [Unit]
    Description=Audio Switch
    
    [Service]
    ExecStart=%s /pfad/zu/audioswitch.sh
    
    [Install]
    Alias=audioswitch.service

    (Das %s bedeutet soviel wie /usr/bin/sh bzw. /bis/sh, also die Shell mit welcher das Script aufgerufen wird.)

    Dann eine Verknüpfung ins Verzeichnis /etc/systemd/system/ erstellen:

    sudo ln -sv /usr/lib/systemd/system/audioswitch.service /etc/systemd/system/

    Dann muss der systemd dämon neu geladen werden, um den neuen Service zu finden.

    sudo systemctl daemon-reload

    Danach kann der Service gestartet werden, mit

    sudo systemctl start audioswitch

    Und wenn's funtioniert, in die Autostart-Liste eingetragen werden

    sudo systemctl enable audioswitch


    Zusätzlich kannst Du Dir die Endlosschleife im Script sparen, wenn Du im Bereich [Service] die Zeile Restart=always einfügst. Die Definition der $tv Variablen vor der while-Schleife kannst Du dann in die if-Abfragen einbauen:

    Bash
    ...
    if [ "${tv:-off}" = "on" ]
    then
    ...

    Edited 3 times, last by samtux ().

  • segio97 Was soll denn das ``eval`` bewirken? Soweit ich das sehe wird da nur die Zeichenkette in `$command` von der Shell zerlegt, und von ``eval`` dann wieder zusammengesetzt und ausgeführt. Warum nicht den Inhalt von `$command` direkt ausführen?

    “Es ist schon über so viele Dinge Gras gewachsen, dass man bald keiner Wiese mehr trauen kann.”