[[Vorlage(Archiviert)]] {{{#!vorlage Wissen [:Editor: Einen Editor öffnen] [:sudo: Root-Rechte] [:Rechte: Rechte für Dateien und Ordner ändern] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis()]] 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: {{{#!vorlage Befehl 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 {{{#!code bash #!/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. = Alternativen = ## * [:Archiv/Skripte/AutoSuspend:] * [github:languitar/autosuspend:] {en} * [github:git-developer/autosuspend:] {en} #tag: Netzwerk, System, Shell, Server, Suspend, hibernate