- Shell 100%
| auto-sleep-wol.service | ||
| auto-sleep.service | ||
| auto-sleep.sh | ||
| auto-sleep.timer | ||
| README.md | ||
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)
ethtoolinstalliert (apt install ethtool)- Netzwerk-Interface, das WoL unterstützt
- Benutzer
chchexistiert 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