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.
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
In der aktuellen OpenELEC-Version (5.0.8) funktioniert bei mir alles noch wie gehabt…
Zwei Ideen zum Erkenntnisgewinn:
sleep
beinhaltet (siehe #3111). Das hat mich damals auf die Spur von systemd gebracht, weil das ersteecho
immer ausgeführt wurde, das zweite aber nicht mehr.Es scheint tatsächlich #1 zu sein. Am (Kabel-)LAN funktioniert es.
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?
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…