Skip to content

Automatischer Shutdown für Linux Server

So ein Server zu hause ist praktisch. Er ermöglicht den Austausch von Dateien, automatische Backups, viel Plattenplatz an einem zentralen Ort und je Anforderungen der Benutzer auch weitere Dienste.

Allerdings hat ein solcher Server, gerade wenn er zu Hause steht, oftmals eine Einsatzdauer von maximal 4-8 Stunden am Tag. Aus Bequemlichkeit laufen die meisten Home Server dennoch 24 Stunden täglich durch. Im Leerlauf verbraten diese Rechner dann zwischen 30 und 300 Watt für nichts. Rechnet man diese Leistung auf einen Monat oder gar ein Jahr hoch stellt man fest, daß man für das Geld lieber etwas anderes getan hätte. Bei einem Leerlauf von 16 Stunden und 100 Watt Leistung kommt man auf etwa 100 Euro Stromkosten im Jahr - für nichts.

Deshalb habe ich ein kleines Script geschrieben, welches einen Linux Server automatisch herunterfährt, wenn keine anderen Rechner im Netz mehr online sind. Denn spätestens wenn kein Rechner mehr online ist, wird der Server nicht mehr benötigt und kann abgeschaltet werden.

Installation

folgendes Script entweder von hier downloaden oder abtippen und unter /usr/local/bin/powersaver.sh speichern (copy+paste tut's natürlich auch):

#!/bin/sh
#
# (cc:by-sa) 2007 Marco Gabriel, http://www.marcogabriel.com/
#
# Powersaver.sh

###
# CONFIG
###

# Filename of the statusfile
STATUSFILE="/tmp/powersaver-status"

# which ip range should be checked?
# this example looks in "192.168.1.10 to 192.168.1.30"
# and "192.168.178.10 to 192.168.178.30"
RANGE="192.168.1,178.10-30"

# how many clients are always on (other servers, routers, etc)
MINCLIENTS=0

# shutdown after how many retries?
RETRIES=2

###
# END CONFIG
###

NUMCLIENTS=`nmap -sP $RANGE -oG - | grep "^Host" | wc -l`

if [ $NUMCLIENTS -le $MINCLIENTS ]; then
if [ ! -f "$STATUSFILE" ]; then
echo "COUNT=$RETRIES" > $STATUSFILE
fi
. $STATUSFILE
if [ $COUNT -le $MINCLIENTS ]; then
echo "Shutdown, my dear..."
shutdown -h now;
else
let COUNT=$COUNT-1
echo "COUNT=$COUNT" > $STATUSFILE
fi;
else
if [ -f "$STATUSFILE" ]; then
rm $STATUSFILE
fi
fi

Nachdem das Script unter /usr/local/bin/powersaver.sh gespeichert wurde muss es gegebenenfalls noch ausführbar gemacht werden:

chmod +x /usr/local/bin/powersaver.sh

Als nächstes muss das Script natürlich regelmässig ausgeführt werden. Hierfür bietet sich ein Cronjob an, der das Script alle 10 Minuten startet. Also erweitern wir /etc/crontab um einen Eintrag, der das Script regelmäßig aufruft:

root@server:~# crontab -e

In der Datei ergänzt man folgenden Eintrag:

*/10 * * * *      /usr/local/bin/powersaver.sh

Nun wird das Script alle 10 Minuten aufgerufen und überprüft, wieviele Rechner online sind. Im oben konfigurierten Standard muss also 3 mal nacheinander (RETRIES=2) kein Rechner (MINCLIENTS=0) mehr gefunden werden, dann wird der automatische Shutdown eingeleitet.

Sollte der Rechner vorher Aufgaben ausgeführt haben, die Nachts automatisch durch cron gestartet wurden, kann man statt cron künftig auch anacron einsetzen. Anacron wurde als cron-Ersatz speziell für Server geschrieben, die eben nicht immer eingeschaltet sind.

Wer's bequem haben will, kann den Rechner bei Bedarf auch per Wake-On-Lan einschalten... :-)

Creative Commons License
This work is licensed under a Creative Commons Attribution-Share Alike 2.0 Germany License.

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

granad am :

Cool, ich bräuchte sowas für meinen Windows-Server!!

Gruß
Sebastian

Juniperus am :

Prima Idee, hatte mal sowas ähnliches als UDP-Broadcast-Lösung - aber so gefällt es mit besser.

Dickes Lob!

Michi am :

Hi.
Tolle Sache.
Weiter so, wird gerne angenommen.
Grüße Michi

Gurge am :

Klasse Script. Da fehlt bloss ein "fi" am Ende des Scriptes hier direkt im Blog. Bei der Downloaddatei ist alles ok.

Mfg Gurge

Timm am :

Klasse, danke für das Script.

Bei einer Suse 10.3 Distribution habe es ein Problem, dass der Cron-Job den shutdown-Befehl nicht ausführen konnte.

Ich habe den Befehl mit dem Pfad geändert:
/sbin/shutdown -h now
nun läuft es!

Danke und einen schönen SO
Timm

Timm am :

Hallo zusammen,

mir ist an dem Script noch was aufgefallen:

In der Schleife:
if [ $COUNT -le $MINCLIENTS ]; then
gibt es das Problem, wenn $MINCLIENTS > Retries (gespreichert in $COUNT) ist, dass der Rechner sofort herunterfährt.

Meiner Meinung nach müsste die Schleife folgendermaßen aussehen, um Clientunabhängig den Rechner erst nach Anzahl RETRIES herunterzufahren:

if [ $COUNT -le "0" ]; then

Oder mache ich hier einen Denkfehler???

Gruß Timm

HaTho am :

hi Alle!

bin auch begeistert, aber habe noch kleines problem:
ein direkter aufruf des scripts fährt den rechner erwartungsgemäß runter.
aber cron führt den shutdown nicht aus!!
wenn ich andererseits das script nur eine message schreiben lasse (shutdown auskommentiert und ein echo > datei rein), dann tut auch cron.

was ist das?!? hilfe hilfe
gruss
hatho

jo am :

ja Hallo zusammen,
und für die Newbees noch der Hinweis, das "nmap" z.B unter Debian erst nachinstalliert werden muß. (jaja, ist ja klar) ;-).Jedenfals funktionierts eiwandfrei auch auf der NSLU2. Vielen Dank für das wirklich tolle Script. Auch noch nach 2 Jahren kann dieser SW Schnipsel noch Leute neu erfreuen.
tausend Grüße
Jo

Hannes am :

Sehe ich auch so. Das Script funktioniert aber, solange man es bei der "Default"-Einstellung MINCLIENTS=0 belässt. Da hat die QA-Abteilung offensichtlich geschlafen.

Bis auf diesen Fehler aber ein sehr nützliches Skript. Danke!

Frank am :

Klasse Script.Ich bin neu in der Linux Geschichte und habe für meinen neuaufgesetzten Server genau soetwas gesucht. Es funktioniert bestens.

@jo
Danke für den Hinweis, das nmap unter Debian nachinstalliert werden muss.

Gruß Frank

Ian Christ am :

Ich spiele gerade mit meinem "allten" eeePC rum und lasse ihn als kleinen Homeserver unter zentyal 2.0.3 (www.zentyal.com) laufen. Mit kleinen Änderungen beim Herunterzählen von $COUNT läuft das Skript wunderbar:

#!/bin/sh
#
# (cc:by-sa) 2007 Marco Gabriel, http://www.marcogabriel.com/
#
# Powersaver.sh

###
# CONFIG
###

# filename of the statusfile
STATUSFILE="/tmp/powersaver-status"

# which ip range should be checked?
# this example looks in "192.168.1.10 to 192.168.1.30"
# and "192.168.178.10 to 192.168.178.30"
# RANGE="192.168.1,178.10-30"
RANGE="192.168.17.100-199"

# how many clients are always on (other servers, routers, etc)
MINCLIENTS=0

# shutdown after how many retries?
RETRIES=2

###
# ENDE CONFIG
###

NUMCLIENTS=`nmap -sP $RANGE -oG - | grep "^Host" | wc -l`

if [ $NUMCLIENTS -le $MINCLIENTS ]; then
if [ ! -f "$STATUSFILE" ]; then
echo "COUNT=$RETRIES" > $STATUSFILE
fi
. $STATUSFILE
if [ $COUNT -le 0 ]; then
echo "Shutdown, my dear..."
shutdown -h now;
else
COUNT=$((COUNT-1))
echo "COUNT=$COUNT" > $STATUSFILE
fi;
else
if [ -f "$STATUSFILE" ]; then
rm $STATUSFILE
fi
fi

konst am :

bei mir (ubuntu LTS 12.04) funktioniert es nur wenn die zeile geändert wird
NUMCLIENTS=`nmap -sP $RANGE -oG - | grep "^Host" | wc -l`
in das:
NUMCLIENTS=`nmap -sP $RANGE | grep "^Host" | wc -l`

Dirk am :

Hi, das ist schonmal ein sehr schön beschriebener Anfang meinen Server (ca. 150w) nicht 24/7 zu betreiben und den WAF zu erhöhen ;-)

Nur wie kann ich erreichen, dass mein Storage Server (U 12.04) bei Dateizugriff eines Clienten automatisch startet und dann nach gewissem Leerlauf ohne Zugriff wieder verlässlich runterfährt?

Mit WOL habe ich mich schon auseinandergesetzt und das läuft ganz gut auch via Android App :-) nur hätte ich das Ganze gerne etwas automatischer.

AK am :

@Dirk :

Ich habe anstelle der Zeile

shutdown -h now;

die Zeile

/usr/sbin/rtcwake -m off -t $(date --date='19:30 tomorrow' +%s) > /dev/null;

"eingebaut". So wird der Server schön am nächsten Tag um 19:30 geweckt (wenn er noch am selben Tag herunter gefahren wurde).

Marco: Danke für das tolle Script. Leistet seit Jahren gute Dienste. Solltest einen Umweltengel dafür bekommen!
Kleine Anmerkung: Die Zeile

if [ $COUNT -le $MINCLIENTS ]; then

verstehe ich nicht. Oben hat hier schon jemand angemerkt, dass es wohl eher

if [ $COUNT -le 0 ]; then

heißen müsste. Da die meisten aber Retries und Minclients wohl auf 0 setzen, fällt das nicht weiter auf...

chepaz am :

Genau über das

"if [ $COUNT -le $MINCLIENTS ]; then"

bin ich gerade auch gestolpert. Das ist wirklich ein einfacher Logikfehler der nur auffällt wenn man das in einem minimal grösserem Netz als nur "Router --> PC" probiert.

@AK: Der Tipp mit 'rtcwake' ist super, vielen Dank dafür!

Kommentar schreiben

Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Um einen Kommentar hinterlassen zu können, erhalten Sie nach dem Kommentieren eine E-Mail mit Aktivierungslink an ihre angegebene Adresse.
BBCode-Formatierung erlaubt
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
Formular-Optionen
tweetbackcheck cronjob