Auto SUSPEND
Archivierte Anleitung
Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Ein Fileserver wird per SSH angesprochen. Der Server soll nach einem bestimmten Zeitraum (z.B. 30 Minuten) ohne Zugriffe selbsttätig in suspend (S3) bzw. hibernate (S4) Modus versetzt werden. (Der Server wird per Wake_On_LAN geweckt, sobald das System gebraucht wird.)
Vorbereitung¶
Das Skript in einen Editor[1] herunterladen, und mit Root-Rechten[2] an entsprechender Stelle speichern (z.B. in /usr/local/sbin/). Außerdem müssen Owner, Group und Rechte[3] richtig gesetzt werden, z.B. im Terminal [4] mit den Befehlen:
sudo chown root:root /pfad/zum/skript/SKRIPT_NAME sudo chmod 744 /pfad/zum/skript/SKRIPT_NAME
Konfiguration¶
Das Skript muss ggf. an eigene Bedürfnisse angepasst werden! Aktuell ist das Skript so eingestellt, dass alle 300 Sekunden (Variable CHECK_INTERVALL
) geprüft wird, ob noch aktive SSH-Sitzungen vorhanden sind. War seit (mindestens) 1800 Sekunden (Variable SUSPEND_DELAY
) keine SSH-Sitzung aktiv, so wechselt das System automatisch in den Energiesparmodus SUSPEND
(Variable SUSPEND_OR_HIBERNATE
). Möchte man diese Einstellungen an eigene Bedürfnisse anpassen, so müssen folgende Variablen direkt im Skript geändert werden:
CHECK_INTERVALL
SUSPEND_DELAY
SUSPEND_OR_HIBERNATE
Das Skript per rc.local auf dem Server automatisch starten lassen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #!/bin/bash # Zweck: # System nach einer Karenzzeit ohne SSH-Zugriffe automatisch in den Schlaf (STR oder STD) versetzen # Sinnvoll ist es, den Rechner per Wake_On_LAN wecken zu lassen, sobald das System gebraucht wird. # Dieses Skript prüft alle $CHECK_INTERVALL Sekunden nach, ob # auf diesen Rechner per SSH zugegriffen wird # Ist dies nicht der Fall, so wird das System (ca.) $SUSPEND_DELAY Sekunden nach # dem Ende des letzten SSH-Zugriffs per # /usr/sbin/pm-suspend wenn SUSPEND_OR_HIBERNATE='SUSPEND' # /usr/sbin/pm-hibernate wenn SUSPEND_OR_HIBERNATE='HIBERNATE' # in den Schlaf versetzt # Erfolgt ein SSH-Zugriff in der "Karenzzeit" $SUSPEND_DELAY, # so wird der Zähler zurückgesetzt, sodass wieder erst $SUSPEND_DELAY Sekunden nach # dem Ende des letzten SSH-Zugriffs das System in den Schlaf versetzt wird # Das Skript sollte idealerweise per rc.local gestartet werden. # Das Skript läuft nach RESUME (Wiederaufwachen) weiter. #-----------------ANPASSEN!---------------# # entkommentieren, um zu sehen, was das Skript macht. Dann sollte man das Skript aber manuell starten! #set -x #-----------------ANPASSEN!---------------# # wie oft (in Sekunden) soll kontrolliert werden, ob (noch) aktive SSH-Sitzungen vorhanden sind? CHECK_INTERVALL=300 #-----------------ANPASSEN!---------------# # Anzahl Sekunden, die vergehen sollten ab Ende der letzten SSH-Sitzung # bevor in SUSPEND/HIBERNATE gewechselt wird SUSPEND_DELAY=1800 #-----------------ANPASSEN!---------------# # SUSPEND=Suspend_To_RAM (S3) # HIBERNATE=Suspend_To_Disk (S4) SUSPEND_OR_HIBERNATE='SUSPEND' #-----------------NICHT AENDERN!----------# # Variablen für letzten Zeitpunkt ohne SSH-Sitzung(en) und aktuellen Zeitpunkt LAST_NO_SSH_TIMESTAMP='x' CURRENT_TIMESTAMP='x' while true do # aktuellen Zeitpunkt speichern CURRENT_TIMESTAMP=$(date +%s) # Sind (noch) Gast-SSH-Sessions aktiv? # nachdem die letzte SSH-Session beendet wurde, wartet der SSHD noch eine Zeit lang im STATE=TIME_WAIT darauf, ob noch Pakete ankommen # wir zählen die Anzahl der SSH-Sitzungen SSH_SESSIONS=$(netstat -ute | grep -i [s]sh | wc -l) if [ $SSH_SESSIONS -ge 1 ] then # weil SSH-Sitzungen (noch) aktiv sind, LAST_NO_SSH_TIMESTAMP "leeren" bzw. "kennzeichnen" LAST_NO_SSH_TIMESTAMP='x' else # da keine SSH-Session (mehr) aktiv # # wenn schon ein älterer TIMESTAMP in LAST_NO_SSH_TIMESTAMP steht, wollen wir diesen nicht überschreiben # daher Abfrage $LAST_NO_SSH_TIMESTAMP == 'x' if [ $LAST_NO_SSH_TIMESTAMP == 'x' ] then # da noch kein TIMESTAMP in LAST_NO_SSH_TIMESTAMP steht # speichere aktuellen TIMESTAMP in LAST_NO_SSH_TIMESTAMP ! LAST_NO_SSH_TIMESTAMP=$CURRENT_TIMESTAMP fi # wenn seit mind. $SUSPEND_DELAY [Sekunden] keine SSH-Session aktiv war, # dann SUSPEND/HIBERNATE gemaess Angabe in $SUSPEND_OR_HIBERNATE if [ $(($CURRENT_TIMESTAMP-$LAST_NO_SSH_TIMESTAMP)) -gt $SUSPEND_DELAY ] then case $SUSPEND_OR_HIBERNATE in SUSPEND) /usr/sbin/pm-suspend ;; HIBERNATE) /usr/sbin/pm-hibernate ;; *) echo "Unbekannte Option" ;; esac fi fi sleep $CHECK_INTERVALL done |
Weitere (andere) Dienste statt SSHD¶
Durch Anpassung der Zeile
SSH_SESSIONS=$(netstat -ute | grep -i [s]sh | wc -l)
kann auch ein beliebiger anderer Dienst abgefragt werden.