staging.inyokaproject.org

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.

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.

Alternativen

Diese Revision wurde am 9. Februar 2020 21:32 von Beforge erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, Server, Suspend, System, Shell, hibernate