Update für OpenELEC-Shutdown-Skript

In meinem Beitrag „RaspberryPi als VDR-Client“ beschrieb ich eine Möglichkeit, beim Herunterfahren des Pis ebenfalls den dazugehörigen VDR-Server auszuschalten. Seither hat sich bei OpenELEC einiges getan.

Zunächst möchte ich auf die Änderungen eingehen, die seit meinem ersten Blogeintrag zu diesem Thema passiert sind. Früher gab es in OpenELEC für XBMC (und alle anderen Anwendungen) Init-Skripten. Um den VDR-Server remote herunterfahren zu können, wurde im XBMC-Init-Skript eine Befehlszeile eingefügt, die das Shell-Skript /storage/bin/shutdown.sh während des Herunterfahrens des Pis aufrief. OpenELEC benutzt seit einiger Zeit diese traditionellen Init-Skripten nicht mehr, sondern setzt systemd-Services als Init-Scripts ein. Diese Änderung betrifft auch die Ausführung des Shutdown-Skripts.

Im Konfigurationsverzeichnis von systemd auf dem Pi (/usr/lib/systemd/system/) finden sich in diesem Zusammenhang drei systemd-Services, die für uns von Bedeutung sind: xbmc-halt.service, xbmc-poweroff.service und xbmc-reboot.service. Die Dateien können auch im Github-Repository von OpenELEC angeschaut werden. Exemplarisch zeige ich den Inhalt von xbmc-halt.service:

[Unit]
Description=XBMC halt script
After=xbmc.service
Before=systemd-halt.service
DefaultDependencies=no

[Service]
Type=oneshot
Environment=HOME=/storage
ExecStart=-/bin/sh /storage/.config/shutdown.sh halt
RemainAfterExit=yes

[Install]
WantedBy=halt.target

Die markierte Zeile enthält die für uns wichtige Information. Hier wird angegeben, dass in /storage/.config/ das Shell-Skript shutdown.sh mit dem Argument halt aufgerufen werden soll. Der Bindestrich vor /bin/sh ignoriert Exit-Codes, die normalerweise einen Fehler anzeigen (siehe). Dies ist notwendig, da shutdown.sh nicht unbedingt existieren muss und schließt somit ein Fehlschlagen des systemd-Services aus.

In den restlichen zwei systemd-Services ändert sich das Argument, das dem Skript übergeben wird zu poweroff beziehungsweise reboot. Dadurch kann man innerhalb des Shutdown-Skripts leicht zwischen den drei verschiedenen Ereignissen halt, poweroff und reboot unterscheiden. Ich persönlich möchte zum Beispiel, dass der Shutdown-Befehl an den VDR-Server nur abgesetzt wird, wenn sich OpenELEC herunterfährt, also entweder halt oder poweroff als Argument übergeben wird. Bei einem Neustart des Pis – weil zum Beispiel ein Update eingespielt wurde – soll der VDR-Server nicht heruntergefahren werden.

Im folgenden Skript, welches auf dem im alten Blogpost gezeigten basiert, wird dieses Argument berücksichtigt:

# shutdown.sh: Shutdown a PC remotely using ssh. The script runs a 
# specific shutdown script on the remote PC.
# Copyright (C) 2012 Manuel Grob
# 
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

HOST="<hostname or IP address>"

METHOD=$1

if [[ "$METHOD" == "halt" ]] || [[ "$METHOD" == "poweroff" ]]; then
        logger -t shutdown 'Trying to connect to VDR server and exec "/usr/local/sbin/shutdown-dvb-sat-sz.sh".'
        /usr/bin/ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 root@$HOST '/usr/local/sbin/shutdown-dvb-sat-sz.sh' >/dev/null 2>&1 && logger -t shutdown 'Successfully connected to VDR server.'
fi

exit 0

In der markierten Zeile ist die IP-Adresse oder der Hostname des VDR-Servers einzutragen und das Skript unter /storage/.config/shutdown.sh abzuspeichern. Beim nächtsten Herunterfahren des Pis sollte das Skript ausgeführt werden.

Ein weiterer Vorteil ist, dass OpenELEC dank der speziellen systemd-Services nicht mehr – im Gegensatz zur alten Lösung – selbstgebaut werden muss. Die notwendingen Aufrufe des Shutdown-Skirpts sind bereits Teil der Standard-Images.

5 Kommentare zu „Update für OpenELEC-Shutdown-Skript“

  1. Bei mir funktioniert es auch nicht. /storage/.config/shutdown.sh wird zwar ausgeführt (debug Meldungen werden erzeugt). Allerdings klappt echo "set Medienzentrale off" | nc FHEM-Server 7072 nicht.

    Wenn ich das Script allerdings direkt (./shutdown poweroff) ausführe funktioniert es.

    Wird das Wlan schon zuvor ausgeschaltet?

    Folgende alte Fehler fand ich dazu:
    https://github.com/OpenELEC/OpenELEC.tv/issues/3111
    https://github.com/OpenELEC/OpenELEC.tv/pull/3118

    1. In der aktuellen OpenELEC-Version (5.0.8) funktioniert bei mir alles noch wie gehabt…
      Zwei Ideen zum Erkenntnisgewinn:

      1. Den Pi (oder was auch immer 😉 ) mal mit Kabel an das Netzwerk anschließen. Ich weiß nicht, ob die WLAN-Schnittstelle evtl. schon vorher runtergefahren wird. Das könnte man so ausschließen…
      2. Vielleicht mal temporär ein Shutdown-Script erstellen, welches ein sleep beinhaltet (siehe #3111). Das hat mich damals auf die Spur von systemd gebracht, weil das erste echo immer ausgeführt wurde, das zweite aber nicht mehr.
  2. Hallo,
    ich benutze ebenfalls OpenELEC (jedoch auf einem INTEL NUC) und möchte gerne ein shutdown Sricpt beim Herunterfahren ausführen, aber es klappt überhaupt nicht.

    Die Datei shutdown.sh gibt es leider bei mir und so habe ich diese selbst erstellt:

    case „$1“ in
    halt)
    /storage/.xbmc/userdata/addon_data/script.xbmc.boblight/shutdownbob.sh
    ;;
    poweroff)
    /storage/.xbmc/userdata/addon_data/script.xbmc.boblight/shutdownbob.sh
    ;;
    reboot)
    # your commands here
    ;;
    *)
    # your commands here
    ;;
    esac

    Hast du eine Idee was ich falsch mache?

    1. Hast du die Datei mit chmod +x shutdownbob.sh ausführbar gemacht? Du könntest auch versuchen, mal ein paar Debug-Statements (echo "Foo" >> /storage/debug.log) an verschiedene Stellen zu setzten, um ein paar Anhaltspunkte zu bekommen…

Schreibe einen Kommentar zu Björn Kommentieren abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert