Systemd code, um einen Rechner einschlafen zu lassen, wenn die letzte Session von chch weg ist
Find a file
2026-06-05 16:25:38 +02:00
auto-sleep-wol.service first commit 2026-06-05 16:25:38 +02:00
auto-sleep.service first commit 2026-06-05 16:25:38 +02:00
auto-sleep.sh first commit 2026-06-05 16:25:38 +02:00
auto-sleep.timer first commit 2026-06-05 16:25:38 +02:00
README.md first commit 2026-06-05 16:25:38 +02:00

Auto-Sleep Server automatisch einschlafen per SSH-Idle

Dieses Set-up versetzt einen Linux-Server in den Suspend-to-RAM (systemctl suspend), sobald 30 Minuten lang keine SSH-Verbindung des Benutzers chch mehr besteht.

Der Server wird per Wake-on-LAN (WoL) aufgeweckt (Einrichtung nicht Teil dieses Projekts) und nach Beendigung der Arbeit automatisch wieder in den Schlaf geschickt.

Voraussetzungen

  • Linux mit systemd (getestet auf Debian/Ubuntu)
  • ethtool installiert (apt install ethtool)
  • Netzwerk-Interface, das WoL unterstützt
  • Benutzer chch existiert auf dem System

Dateien

Datei Zweck
auto-sleep.sh Prüfscript erkennt SSH-Sessions und verwaltet Grace-Zeit
auto-sleep.service systemd oneshot führt das Script aus
auto-sleep.timer systemd timer startet den Service alle 5 Minuten
auto-sleep-wol.service systemd oneshot stellt WoL nach Resume wieder her

Installation

1. Script installieren

sudo cp auto-sleep.sh /usr/local/bin/
sudo chmod 755 /usr/local/bin/auto-sleep.sh

2. systemd-Units einrichten

sudo cp auto-sleep.service  /etc/systemd/system/
sudo cp auto-sleep.timer    /etc/systemd/system/
sudo cp auto-sleep-wol.service /etc/systemd/system/
sudo systemctl daemon-reload

3. Timer aktivieren

sudo systemctl enable --now auto-sleep.timer

Status prüfen:

systemctl status auto-sleep.timer
systemctl list-timers --all | grep auto-sleep

4. WoL-Resume-Hook aktivieren

sudo systemctl enable auto-sleep-wol.service

Der Dienst stellt nach jedem Suspend/Resume automatisch sicher, dass WoL auf dem Default-Interface aktiv ist (ethtool -s <iface> wol g).

5. Testlauf

Einmalig ausführen:

sudo /usr/local/bin/auto-sleep.sh

Das Script legt bei erstem Aufruf die Datei /run/auto-sleep/idle_since an. Nach 30 Minuten (bzw. nach 6 Timer-Durchläufen) würde der Server suspendieren.

Funktionsweise

Timer (alle 5 Min)
  │
  └→ auto-sleep.sh
       │
       ├─ Hat chch eine SSH-Verbindung?
       │   │
       │   ├─ Ja → /run/auto-sleep/idle_since löschen → Ende
       │   │
       │   └─ Nein → existiert idle_since?
       │              │
       │              ├─ Nein → date +%s > idle_since → Ende
       │              │
       │              └─ Ja → 30 Min überschritten?
       │                       │
       │                       ├─ Nein → Ende
       │                       │
       │                       └─ Ja → systemctl suspend

SSH-Erkennung im Detail

Das Script verwendet ss -tpH state established um alle aktiven TCP-Verbindungen auf Port 22 (SSH) zu finden. Für jede gefundene PID wird der Prozessbaum hochgewandert bis PID 1, um festzustellen, ob einer der beteiligten sshd-Prozesse dem User chch gehört.

Damit werden erfasst:

  • interaktive SSH-Sessions (ssh chch@server)
  • Non-Interactive-Sessions (rsync, git, scp über SSH)
  • Port-Forwardings

Grace-Zeit (30 Minuten)

Der Grace-Timer wird in /run/auto-sleep/idle_since gespeichert. Dieses Verzeichnis liegt auf einem tmpfs (RAM) und geht bei Neustart verloren die Grace-Zeit beginnt dann von Neuem.

Situation Verhalten
chch verbindet sich Grace wird sofort zurückgesetzt
chch trennt Verbindung Grace startet (Timestamp wird gesetzt)
30 Min ohne chch vergangen Server suspendiert
WoL-Packet → Server wacht auf Grace ist weg (RAM flüchtig) → neu aufbauen → nach 30 Min ohne SSH wieder einschlafen

Konfiguration

Anpassungen in auto-sleep.sh:

CHCH_USER="chch"       # Benutzername, der überwacht wird
GRACE_SECONDS=1800     # Wartezeit nach letzter SSH-Session (Sekunden)

Nach Änderungen muss kein systemctl daemon-reload ausgeführt werden, da das Script direkt aufgerufen wird.

Logging

Das Script loggt die Suspension mit logger ins syslog:

journalctl -t auto-sleep -n 10

Fehlersuche

# Manuell prüfen, ob chch SSH-Sessions hat
sudo /usr/local/bin/auto-sleep.sh; echo $?
# → 0 (Script läuft durch)

# Inhalt der Grace-Datei prüfen
cat /run/auto-sleep/idle_since

# Timer-Status
systemctl status auto-sleep.timer

# Letzte Timer-Ausführungen
journalctl -u auto-sleep.service -n 20

# WoL-Status des Interfaces prüfen
ethtool "$(ip -4 route show default | cut -d' ' -f5)" | grep Wake-on

Deinstallation

sudo systemctl disable --now auto-sleep.timer
sudo systemctl disable auto-sleep-wol.service
sudo rm /etc/systemd/system/auto-sleep.service
sudo rm /etc/systemd/system/auto-sleep.timer
sudo rm /etc/systemd/system/auto-sleep-wol.service
sudo rm /usr/local/bin/auto-sleep.sh
sudo systemctl daemon-reload