Synology NAS bei Nichtgebrauch herunterfahren

Update: Nach dem DSM6 Update hatte ich zuerst Probleme mit dem Cron, nachdem ich diesen aber über die DSM Gui eingestellt habe, sind die Probleme nun weg. Einer der großen Vorteile im Bezug auf DSM 6 ist der Ersatz von Busybox durch Bash. Dies sollte Raum für ein paar Verbesserungen im Skript bieten.

Nachdem ich lange mit mir gekämpft habe, war es im letzten Monat nun endlich soweit und ich habe mir ein Synology NAS gekauft. Zwar bietet Synology hier die Möglichkeit, sowohl die Festplatten als auch das NAS selbst, bei Inaktivität in einen Standby-artigen Zustand zu versetzen (Deep Sleep), dennoch finde ich es wenig sinnvoll das Gerät laufen zulassen, wenn kein Zugriff zu erwarten ist.

Glücklicherweise scheine ich aber nicht der einzige zu sein, der so denkt. So bin ich dann irgendwann auf einen Blogeintrag von Dominik gestoßen, welcher das deutsche Synology Forum als Quell der Inspiration zurate gezogen hat. Nachdem ich für ein paar Tage erfolgreich eine modifizierte Version von Dominiks Skript laufen hatte, ist es mir leider beim Update auf DSM 4.3 abhanden gekommen. Um den Schmerz des Verlusts zu überwinden habe ich das Skript von Grund auf neu geschrieben und natürlich ein regelmäßiges Backup von /root eingerichtet.

Umgebung

Zuerst noch ein bisschen zu meiner Umgebung: Das NAS läuft bei mir als zentraler Speicherort für Medien (Fotos, Musik und Filme), Downloadstation, TV Streaming Server mit Tvheadend und zentrale Datenbank für meine beiden XBMC Systeme. Bei Bedarf wecke ich das NAS per WoL z.B. über ein kleines PHP Skript. Das Shutdown-Skript führe ich per Crontab aus, welcher wie folgt aussieht:

Werktags läuft das Skript also von 21:00 bis 5:59 und 9:00 bis 16:59, wobei mir am Wochenende eine Überprüfung von 21:00 bis 5:59 reicht.

Ebenfalls wichtig zu erwähnen ist, dass das Skript mit der Standardshell (ash) funktioniert und kein installiertes Bash benötigt.

Das Grundgerüst

Nun aber zu den einzelnen Bestandteilen des Skripts:  

Das Grundgerüst des Skript besteht aus der  Definition des Logfiles und der Definition des Zählers, welcher dafür genutzt wird die erfolgreichen Durchgänge zu zählen. Zusätzlich gibt es im Kopf des Skriptes zwei Funktionen. Die erste Funktion (log) ist dafür zuständig Logmeldungen einheitlich mit einem Zeitstempel zu versehen, die zweite Funktion (cancel) setzt den Counter zurück, hält das Skript für neun Minuten an – und blockiert somit eine weitere Ausführung per Cron – und beendet anschließend den aktuellen Durchlauf.

Auf diese Funktion folgen die einzelnen Checks, welche modular eingefügt oder weggelassen werden können. Diese Checks habe ich der Übersichtlichkeit halber oben nicht aufgeführt, sondern werde später näher auf jeden Check einzeln eingehen.

Nachdem alle Checks fehlgeschlagen sind, also die einzelnen Prüfbedingungen (z.B. Rechner per Ping erreichbar) nicht zugetroffen haben, wird der Counter erstellt/inkrementiert. Zu guter Letzt wird dann noch überprüft wie oft der Counter inkrementiert wurde, wurde der Counter bereits zehn mal hochgesetzt fährt das System herunter.

Da ich das NAS von Zeit zu Zeit als digitalen Videorekorder nutze aktualisieren ich aber vor dem Herunterfahren noch die automatischen Weckzeiten (Zeile 28 und 29). Hierfür verwende ich ein leicht angepasstes Skript, welches ich auf Github gefunden habe.

Stopfile

In einem kleinen Follow up beschreibe ich einen Weg dieses Stopfile über einen Webbrowser zu setzen.

Minimum Uptime

Damit das NAS nicht direkt nach dem Wecken wieder runterfährt gibt es den folgenden Check (verzögert um 30 Minuten):

SynoBackup

 Verbindung offen

Falls weitere Verbindungsarten das Herunterfahren des NAS verhindern sollen, kann der grep-Befehl entsprechend erweitert werden. In meinem Beispiel steht https für die Photo Station, 5000 und 5001 für unverschlüsselte bzw. verschlüsselte Verbindungen zur Audiostation und dem DSM allgemein und 5006 für https Verbindungen zum WebDAV Dienst.

Um False Positive Meldungen zu vermeiden, sollten die Portangaben mit dem Hostname versehen werden, welcher in meinem Fall „fozzie“ ist.

Transmission BitTorrent

SABnzbd

Verbindung von bestimmten Rechner

Die Variable ACTIVEHOSTS nimmt die IPv4 Adressen (separiert mit Leerschritt) von Rechnern die das Herunterfahren bei aktiver Verbindung verhindern sollen.

Tvheadend Status

Update (27.09.13): Ausgabe der Abfrage von status.xml in Variable speichern und diese auswerten statt status.xml erneut abfragen. Außerdem hat curl nun ein Timeout, da Tvheadend bei mir manchmal hängt und so curl zwar eine Verbindung bekommt, aber keine Ausgabe geliefert bekommt.

Update (01.10.13): Das Timeout in Curl gilt leider nur für die Zeit bis der Webserver initial antwortet, wenn Tvheadend „abgestürzt“ ist antwortet aber immernoch der Webservice, liefert aber keine Daten zurück. Daher wird statt einem Timeout jetzt „–max-time 5“ verwendet, welche die Laufdauer von Curl auf 5 Sekunden begrenzt (ein oder zwei Sekunden würden vermutlich auch reichen).

Zeit bis nächster Aufnahme

Update (27.09.13): status.xml wird jetzt aus einer Variablen geholt.

Sollte die nächste Aufnahme in weniger als 90 Minuten beginnen, wird das Herunterfahren verhindert.

UPDATE: If Abfrage ergänzt um keine Fehlermeldung bei Nichtvorhandensein von geplanten Aufnahmen (Variable $till ist leer) zu bekommen.

Ping

Als letzten Check führe ich einen Ping aus. Dieser soll verhindern, dass das NAS herunterfährt, während eines meiner beiden XBMC Systeme angeschaltet sind.  Wie auch bei den ACTIVEHOSTS, werden in der PINGHOSTS Variable mehrere Werte per Leerschritt getrennt.

Alle Skripte im Schnellzugriff:

18 Gedanken zu „Synology NAS bei Nichtgebrauch herunterfahren

  1. Vielen Dank für dieses sehr nützliche und durchdachte script! Ein kleiner Vorschlag meinerseits vielleicht: in Zeile 84 so ändern, daß das script auch ohne installiertes tvheadend funktioniert: bei mir führte die Bedingungung dazu, daß die Funktion cancel() das Herunterfahren blockierte. Im Log stand bei mir entsprechend: „Tvheadend is active“, obwohl es bei mir nicht installiert ist und war. Ich habe die entsprechendenden Zeilen, die tvheadend betreffen, aus dem script gelöscht.

    Ansonsten lief das script mit den wenigen, im Artikel gut beschriebenen Anpassungen bzgl. Diskstation-Name und den Rechner-IPs auf Anhieb. Sehr nützliches Programm.

    1. Hallo Mathias,

      danke für dein Feedback. Stimmt hierüber war ich auch schon einmal gestolpert und habe dies auch im Beitrag aktualisiert, allerdings nicht auf Github. Dies habe ich gerade mal nachgeholt.

      1. Hi,
        sehr guter Artikel. Das Projekt will ich auch angehen. Seit ich TVheadend installiert habe, fährt die DS nicht mehr in den Ruhezustand. Ich hoffe dies mit dem Skript beseitigt zu bekommen.

        Eine Frage nur, wie und wo muss ich die Skripte speichern? Für einen Tipp danke ich vorab. Viele Grüße Thomas

        1. Hallo Thomas,

          ich fürchte der Systemruhezustand von Synology und dieses Skript sind zwei verschiedene Paar Schuhe. Mein Skript fährt die DS herunter zu Zeiten an denen ich für gewöhnlich nicht Zuhause bin. Würdest du das Skript permantent ausführen, würde durch dieses ebenso der Ruhezustand der DS verhindert.

          Ich bin nebenbei gesagt dazu übergegangen Tvheadend auf einem anderen System laufen zu lassen und lediglich die DS als Speicherort für Aufnahmen zu verwenen.

  2. …danke für Deine Nachricht. Stimmt natürlich, eine Lösung meines Problems ist das nicht wirklich. Trotzdem ist das WOL einen Versuch wert. In welchem Verzeichnis hast du die Skripte abgespeichert?
    Ich werde das TV headend vielleicht auch auslagern, habe noch einen PI, vielleicht läuft es da besser.

    1. Hallo Thomas,

      ich persönlich habe mein Skript direkt in /root liegen, dies ist aber potentiell schwierig da diese Daten mit jedem Update verworfen werden. Ein besserer Ort ist vermutlich /volume1/homes/admin/bin.

      Und ja der Rpi ist vermutlich ein besserer Ort (weniger Energieverbrauch). Das Mounting könntest du dann per automount machen.

  3. Hallo,

    Ich habe auch schon öffters überlegt meine Diskstation automatisch hoch/runterfahren zulassen.
    Leider bin ich noch am anfang vom programmieren . 🙁
    Daher wäre vielleicht ein kleines tool mit benutzeroberfläche ganz cool. So mit einstellungsdinger wie “ von wann bis wann “ oder welche tage.

    Ich hätte da noch ein Anliegen.

    Ich bin Berufsbeding ala 3 Wochen in der Spätschicht ( 14:00-22:00 ), da wäre es doof , wenn ich nach Hause komme und meine Diskstation gerade runter fährt und ich Sie wieder per WOL starten darf.

    Vielen dank und Danke im Vorraus.

  4. Zur Überprüfung ob pyload gerade noch zieht:

    #pyload check
    if pyLoadCli status | grep downloading > /dev/null; then
    log "Pyload is currently downloading"
    cancel
    fi

    1. I had to change this to:

      /volume1/@appstore/pyload/bin/python /volume1/@appstore/pyload/pyload/pyLoadCli.py status

      Furthermore, ensure that teh CLI is enabled in /volume1/@appstore/pyload/var/config/pyload.conf:


      remote - "Remote":
      bool nolocalauth : "No authentication on local connections" = True
      bool activated : "Activated" = True
      int port : "Port" = 7227
      ip listenaddr : "Adress" = 0.0.0.0

  5. Super Script vielen Dank. Ich habe bei mir unter DSM 5 geplante SMART Tests eingerichtet. Gibt es eine Möglichkeit zu überprüfen ob gerade ein SMART Test läuft, so dass die Box dann nicht runtergefahren wird?

  6. Hallo,

    auch mich interessiert dieses Skript, da bei mir die DS auch nicht 24h laufen muss.
    Da ich nicht Tvheadend nutze:
    – Benötige ich dann nur den Scriptteil aus dem „Grundgerüst“?
    – Die Start/Aus Einstellungen im DSM können dann entfallen, ist das richtig?
    – Wie muss die Scriptdatei heißen und wo muss sie abgespeichert werden? Ich nehme an im Verzeichnis root des Admin, Wie kommt man zu diesem Verzeichnis?
    – Wie muss die Crontab Datei heißen und wo abgespeichert werden, wo erstele ich einen Cronjob? Kann ich das im DSM in der Systemsteuerung mit dem Aufgabenplaner machen?

    Vielen Dank für die Hilfe!

    1. Hallo Olaf,
      – ja du benötigst das Grundgerüst und kannst in dieses dann die Checks einfügen, die du benötigst.
      – du meinst ein automatisches herunterfahren über den Aufgabenplaner des DSM? Hierauf könntest du in der Tat verzichten.
      – wie du in meinem Crontag Eintrag sehen kannst, heißt es bei mit „shutdown_on_not_used“ und liegt im Verzeichnis /root. Da dieses Verzeichnis beim Update geleert wird ist es unter Umständen besser z.B. /volume1/homes/admin zu benutzen.
      – Wie du den Crontab auf Synology bearbeitest, findest du hier: http://www.synology-wiki.de/index.php/Cron

      Grüße

  7. Hallo

    Habe leider mit dem TVheadend Script Teil Probleme das die Zeiten in die Poweron Timer Datei schreibt,ich kriege leider immer folgende Fehler ausgegeben:

    Traceback (most recent call last):
    File „pvr_poweron.py“, line 19, in
    data = json.loads(data)
    File „/usr/lib/python2.7/json/__init__.py“, line 339, in loads
    return _default_decoder.decode(s)
    File „/usr/lib/python2.7/json/decoder.py“, line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File „/usr/lib/python2.7/json/decoder.py“, line 380, in raw_decode
    obj, end = self.scan_once(s, idx)
    ValueError: Invalid control character at: line 25 column 21 (char 505)

    Nutzen tue ich das ganze mit TVheandend 4.1 .2126 ,eventuell ne Ahnung wo das Problem liegt?

Schreibe einen Kommentar

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