WakeUp-Shutdown - linuxu3er

linux
u3er
Direkt zum Seiteninhalt
WakeUp/Shutdown
Viele Leute haben einen Server der ständig läuft, dass möchte ich nicht, daher soll mein MediaPC im Leerlauf herunterfahren. Ich habe dazu ein Skript geschrieben, welches diese Aufgabe erfüllt und einige Bedingungen abprüft. Vorher aber erstmal eine einfache Lösung.
1. Phase: Onboard Lösung mit Kodi
Kodi kann von sich aus mit ein wenig Hilfe eine Simple Version eines automatischen Shutdowns und Aufwachens realisieren. Unter Einstellungen / System / Energiesparen kann man einstellen, dass Kodi nach einer bestimmten Zeit im Leerlauf beendet wird oder den Computer runterfährt. Man kann durch Auswahl von "Computer ausschalten" nach 5min Leerlauf einen automatischen Shutdown des Computers realisieren.
Beim Beenden soll Kodi einen Weckbefehl setzten wenn Aufnahmen geplant sind. Ein entsprechendes Skript kann man unter Einstellungen / TV / Energiesparen einsetzten. Dazu wird rtcwake benötigt das Teil der util-linux Paketes ist. Um die Funktionalität von rtcwake zu testen kann man in der Konsole erstmal einen Test machen und schauen, ob das System nach 2 min (120s) wieder hochfährt. Mit dem Parameter t kann man das gleich auch mit Unixzeit z.B. von einem VDR Timer versuchen.
sudo apt-get install util-linux
sudo rtcwake -m no -s 120 && sudo poweroff

Wenn der Test erfolgreich war kann man in Kodi das folgendes Skript von KrautBox zum Setzen des Weckbefehls für Aufnahmen nutzen:
#!/bin/bash
# Hole Parameter
PARAMETER="$1"
DATUM=$(date --date='@'$PARAMETER)
DATEI="wakeup_set_kodi.log"
# Kommando
KOM="sudo rtcwake -m no -t $PARAMETER && sudo poweroff (durch Kodi)"
# Logging
echo "Einschlafzeit: " $(date) >> $DATEI
echo "Kommando:      " $KOM >> $DATEI
echo "Aufwachzeit:   " $DATUM >> $DATEI
echo "------------------" >> $DATEI
# Timersetzen
sudo rtcwake -m no -t $PARAMETER

Das Skript einfach im Homeverzeichnis ablegen und ausführbar machen oder hier downloaden. Anschließend muss noch sudo angepasst werden, sodass beim Ausführen von rtcwake keine Passwortabfrage erscheint. Letzte Zeile muss eine Leerzeile sein und bleiben.
sudo chmod +x wakeup_set_kodi
sudo visudo
icke =ALL:NOPASSWD:/usr/sbin/rtcwake
Bei Aufnahmen startet der Computer, bei Leerlauf fährt er runter. Sieht erstmal nach dem Ziel meiner Träume aus. Leider gibt es ein Problem, wenn man noch etwas anderes auf dem MediaPC machen möchte, da Kodi ohne Rücksicht auf Verluste den Computer nach 5min Leerlauf (aus Sicht Kodi) runterfährt. Sollte man also zur selben Zeit Daten im Netzwerk übertragen, ein Backup-Programm laufen lassen oder per SSH verbunden sein hat man Pech.

2. Phase: Das Skript
Um die Probleme mit der Kodi Onboard Lösung zu eleminieren habe ich ein Python Skript geschrieben und benutze crontab zum auslösen des Skripts. Zuerst müssen wir dazu die Kodi Einstellungen aus Phase 1 umstellen. Das Kodi Wakeup-Skript kann entfernt werden und anstatt runterzufahren, beenden wir Kodi einfach nur im Leerlauf.

Um nicht jeden Teil des Skripts mit Code hier zu erklären, versuche ich einen Großüberblick zu geben. Das komplette Skript könnt ihr hier runterladen und im Editor genauer betrachten. Im Hauptprogrammm werden verschiedene Bedingungen geprüft, trifft mindestens eine davon zu, wird das herunterfahren verhindert. Das Skript ist eine Abwandlung von Limag aus dem Ubuntu Forum.

  • Bedingung Aufnahme (vdr)
Es wird geschaut, ob aktuell oder innerhalb der nächsten 10 min eine Aufnahme läuft, wenn ja soll der MediaPC weiter laufen. Ansonsten wir geschaut, ob es einen Timer in der Zukunft gibt, wenn ja wird dieser als Wakeup Zeitpunkt gesetzt. Der nächste Timer wird über svdrpsend ausgelesen.
 vdr_output=subprocess.check_output('/usr/bin/svdrpsend NEXT abs', shell=True)
...
if vdr_record == currentTime:
   print("Keine Aufnahme geplant")
   return False
 elif vdr_record < -600:
   print("Aufnahme in der Zukunft: ", vdr_timer)
   timer = int(vdr_timer)
   wakeupTime(timer)
   return False
 elif vdr_record >= -600:
   print("Aufnahme läuft aktuell bzw. beginnt in den nächsten 10min")
   return True
 else:
   print("")
   return True
...
subprocess.run("/usr/sbin/rtcwake -m no -t %s"%(time), shell=True)

  • Bedingung Terminalverbindung (ssh)
Es wird geschaut, ob eine SSH Verbindung zum MediaPC besteht, wenn ja soll der MediaPC nicht heruntergefahren werden. Dies wird über eine netstat Abfrage erreicht.
def ssh():
 try:
   sOut=subprocess.check_output('/bin/netstat --tcp --numeric | grep --count ":22"', shell=True)
   active = (int(sOut.decode()) > 0)
   print("SSH Verbindung aktiv")
   if active:
     return True
 except subprocess.CalledProcessError as e:
    print("SSH Verbindung inaktiv")
 return False

  • Bedingung Programm
Es wird geprüft, ob das gewünschte Programm läuft, wenn ja soll der MediaPC weiterlaufen. Wird genutzt um zu schauen, ob z.B. Kodi noch läuft oder Firefox. Dazu wird pgrep genutzt.
def programActive(name):
 try:
   sOut=subprocess.check_output('/usr/bin/pgrep %s'%(name), shell=True)
   active = (nlcount(sOut) > 0)
   print("Folgendes Programm ist aktiv", name)
   if active:
     return True
 except subprocess.CalledProcessError as e:
   print("Folgendes Programm ist inaktiv: ", name)
   return False

Das Skript packt ihr an eine beliebige Stelle und macht die Datei ausführbar. Anschließend könnt ihr in crontab darauf verweisen und es regelmäßig ausführen. In meinen Fall alle 10min. Wichtig ist, dass das Skript als Superuser ausgeführt wird, da sonst keine Berechtigung besteht das System herunterzufahren oder die Wakeup Zeit zu stellen.
sudo chmod +x wakeup_set_crontab
sudo crontab -e
m h  dom mon dow   command
*/10 * * * * /usr/bin/python3 /home/icke/Scripts/wakeup_set_crontab.py >> /home/icke/cron.log 2>&1

Sofern es Probleme mit cron gibt könnt ihr über "grep CRON /var/log/syslog"  eventuell ein Problem feststellen.

Was noch implementiert werden könnte/sollte ist:
  • eine Abfrage nach einem SAMBA Datenverkehr bzw. MediaPC bleibt an solange andere PC's an sind
  • eine Abfrage, wenn ein Backup läuft, sobald ich weis welches Programm ich nutze
  • eine E-Mail Benachrichtigung statt schreiben in Datei bzw. Logging über Syslog
  • Optimierung der Codezeilen

Zurück zum Seiteninhalt