FreeNAS: automatisch bei Nicht-Benutzung abschalten

shutdown cronjob
Alle 15min das Script ausführen, mit dem geprüft wird, ob noch ein Rechner läuft, der das NAS brauchen könnte.

Wer wie ich sein NAS zuhause einsetzt, braucht es nicht die ganze Zeit aktiv. Leider bietet FreeNAS von Haus aus keine Funktion, das NAS herunter zu fahren, wenn es nicht gebraucht wird – also kein Rechner im Netzwerk online ist. Im FreeNAS-Forum sowie im PCGH-Extreme-Forum gibt es Anleitungen, wie man mit einem Cronjob regelmäßig (ich prüfe alle 15 Minuten) testen kann, ob noch ein Rechner auf einen Ping antwortet.

Problematischer ist das automatische Starten. Leider unterstützt FreeBSD (was als Basis für FreeNAS dient) in der Version 8.2 kein Wake-On-LAN mit der Onboard-Netzwerkkarte meines HP N36L. Dies lässt sich mit einem von Hand gepatchten FreeNAS umgehen (was eher kompliziert ist) oder mit einer anderen Netzwerk-Karte: meine Wahl fiel auf die Intel EXPI9301CT PCI-Express, welche laut verschiedene Berichten unterstützt werden soll und für 25,-Euro im Handel erhältlich ist. Das Script, welches ich ein wenig angepasst habe, stammt ursprünglich aus dem FreeNAS-Forum und ist hinter dem „mehr…“-Link zu finden. Danach muss es nur als Cronjob eingerichtet werden.

#!/bin/bash
HOST1=192.168.0.33 #IP des ersten PC
HOST2=192.168.0.35 #IP des zweiten PC
ip_range=192.168.0. #Netzadresse des eigenen Netzwerkes ohne den Hostanteil
ip=40 #checke Netz ab IP-Adresse 40

_exit () {
case $1 in
  1) echo "Kein Shutdown - Mindestens einer der PCs ist eingeschaltet" ;;
  2) echo "Kein PC online - Shutdown" ; shutdown -p now ;;
esac
exit $1;
}

# Checken ob PC's an sind
if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] ;
then _exit 1; # abbrechen, ein PC läuft
# Wenn kein PC an ist, gehe zu Checken ob PC's im IP-Bereich an sind
else

# Checken ob PC's im IP-Bereich an sind
  while [ $ip -le 45 ] #checke Netz bis Hostanteil 45
do
  ping -c 1 -i 1 $ip_range$ip #ping mit der zusammengesetzten IP-Adresse aus den o.a. Variablen "ip" und "i"
  if [ `ping -c 1 -i 1 $ip_range$ip | grep -wc 100.0%` -eq 0 ] #sobald einer der Hosts auf den ping antwortet, nicht herunterfahren
then _exit 1 #beenden mit exit 1 (kein shutdown)
fi
 ip=$(( $ip+1 )) #erhöhe Hostanteil immer um 1
done

_exit 2 # hat kein PC geantwortet, shutdown
fi

Das Script hat zwei Teile: der erste (bis Zeile 18) prüft, ob einer der fest eingetragenen Rechner an ist. Der Teil ab Zeile 22 checkt einen Bereich von IP-Adressen, in diesem Beispiel von 192.168.0.40 bis 192.168.0.45. Was man allgemein bedenken muss: auch Geräte wie iPhone oder iPad liefern einen Ping zurück und würden das NAS am herunterfahren hindern. Deswegen wird es in den meisten Netzwerken das Beste sein, nur auf einige bestimmte IP-Adressen zu prüfen und die Prüfung auf einen IP-Adressen-Bereich auszukommentieren.

Wichtig: der Aufruf des – in meinem Fall shutdowncheck.sh benannten – Scripts muss mit absoluter Pfadangabe erfolgen, sonst kann der Cronjob es nicht finden. In meinem Fall muss als Cronjob folgendes eingetragen werden:

sh /mnt/Daten/shutdowncheck.sh

Sobald die neue Netzwerkkarte geliefert wurde, werde ich entsprechend ein Update schreiben, bei dem es um FreeNAS und Wake-On-Lan (kurz WOL) geht – bis dahin wird das NAS von Hand eingeschaltet, wenn es gebraucht wird.

15 Kommentare

  1. Hallo,

    klasse Beitrag, genau was ich gesucht habe!

    Allerdings klappt das bei mir nicht.. Habe es mit PuTTY getestet, da kommt jedoch diese Meldung:

    : not found

    /mnt/Daten/Allgemein/shutdowncheck.sh: 8: Syntax error: expecting „in“

    Wo liegt da der Fehler?

      1. Ich werde heute Abend noch mal das komplette Script posten – das läuft zumindest bei mir mit aktuellem FreeNAS. Was noch ein Problem sein könnte: die Rechte des Scripts. Das muss 755 haben, damit es ausführbar ist (chmod +755 dateiname)

        1. Hatte dasselbe Problem, wenn man unter Windows das Script speichert, muss man den Editor so einstellen das er die Datei mit Unix EOL (end of line) speichert sonst funktioniert es nicht und gibt den Fehler aus.

  2. Hallo

    Ich habe das Script (änlich wie das) seit ca. 2 jahren am laufen. Nur in der letzten zeit, hängt sich mein nas beim herunterfahren auf. wen ich es von hand herunter fahre und wieder mit wol wecke funktioniert alles. hatt jemand eine idee an was das liegen könnte?

    Bs: freenas 8.3.0 release

    1. Meinst du 9.3.0? Davon ab: ich habe aktuell das Problem, dass sich die Boot-Reihenfolge ändert, wenn es automatisch herunterfährt. Sollte eigentlich nicht passieren – vielleicht ist es bei dir etwas ähnliches?

      1. Nein ist schon 8.3.0 wie schon geschrieben, das Script funktionierte einwandfrei für eine gewisse zeit. jetzt aber hängt sich das NAS beim Script Shutdown auf. Wenn Ich das NAS über die WebUi Herunterfahre, passiert das nicht. Meinst du die Boot-Reihenfolge im Bios? Kann Mir gerade nicht vorstellen, dass das einen grossen zusammenhang haben kann.

        1. hm, das ist aber seltsam – ich vervende das Script unverändert mit 9.3.0 (aktueller Stable-Train) auf einem HP N36L und es macht genau das, was es soll.

          Das Problem mit der Bootreihenfolge kam daher, dass ich eine 5. HDD an den SATA-Anschluss für das optische Laufwerk geklemmt habe. Das hat dann leider die Bootreihenfolge verwürfelt, warum auch immer.

          1. Das Benutze ich zur Zeit:

            #!/bin/bash

            HOST1=192.168.1.3
            HOST2=192.168.1.41
            HOST3=192.168.1.4 HOST4=192.168.1.4
            HOST5=192.168.1.4

            _exit () {
            case $1 in
            1) echo „Kein Shutdown – Mindestens einer der PCs ist eingeschaltet“ ;;
            2) echo „Kein PC online – Shutdown“ ; shutdown -p now ;;
            esac
            exit $1;
            }

            # Checken ob PC’s an sind
            if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;

            # Wenn kein PC an ist, 10 sec warten falls gerade einer Neu startet
            else
            echo „Kein PC online – Warte 90 Sekunden“
            sleep 90

            # noch mal PC’s checken
            if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;

            # Wenn kein PC an ist, gehe zu exit case 2 (Shutdown)
            else
            _exit 2
            fi
            fi

  3. Hallo,

    ich habe das Script so wie dieses hier auf Freenas 9.3 gemacht und den Cronjob eingerichtet funktioniert soweit auch. Aber wenn ich den Server hochfahre ist der Ordner und die Datei mit den script wieder weg. Was Habe ich falsch gemacht?

    1. In welchem Verzeichnis hast du es untergebracht? Das Script muss auf dem Daten-Pool abgelegt sein, das Bootmedium von FreeNAS ist dafür ungeeignet und wahrscheinlich eh Read-Only.

      1. Das benutze ich zur Zeit:
        #!/bin/bash

        HOST1=192.168.1.3
        HOST2=192.168.1.41
        HOST3=192.168.1.4 HOST4=192.168.1.4
        HOST5=192.168.1.4

        _exit () {
        case $1 in
        1) echo „Kein Shutdown – Mindestens einer der PCs ist eingeschaltet“ ;;
        2) echo „Kein PC online – Shutdown“ ; shutdown -p now ;;
        esac
        exit $1;
        }

        # Checken ob PC’s an sind
        if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;

        # Wenn kein PC an ist, 10 sec warten falls gerade einer Neu startet
        else
        echo „Kein PC online – Warte 90 Sekunden“
        sleep 90

        # noch mal PC’s checken
        if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;

        # Wenn kein PC an ist, gehe zu exit case 2 (Shutdown)
        else
        _exit 2
        fi
        fi

        1. Hallo,

          Ich versuche dieses Skript (wurde von mir leicht modifiziert – Das Echo wurde verändert) auf meinem Raspberry Pi laufen zu lassen, allerdings wird mir angezeigt, dass mindestens ein PC noch online wäre, obwohl alle abgeschaltet sind.

          Hast du eine Idee woran das liegen könnte?
          LG

  4. Hallo,
    Ich versuche das Script auf einem XigmaNAS zum laufen zu bringen. Wenn ich das als Befehl ausführe funktioniert alles korrekt, starte ich es als Cronjob wird es nicht ausgeführt. Problem ist diese Zeile: if [ `ping -c 1 -i 1 $ip_range$ip | grep -wc 100.0%` -eq 0 ]

    Weiß jemand den Grund?

    Grüße
    Stefan

Schreibe einen Kommentar

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