linux-rhel-centos-fedora systemd logind user-sessions rhel management

User Sessions & systemd-logind (Artikel 077)

Verwaltung von Benutzersitzungen mit systemd-logind. Erfahren Sie, wie RHEL Sitzungen trackt, Ressourcen für eingeloggte User verwaltet und wie Sie das Session-Verhalten konfigurieren.

# systemd-logind: Sitzungsverwaltung im Enterprise-System

TL;DR / Management Summary Jedes Mal, wenn Sie sich per SSH einloggen oder an einer Konsole anmelden, tritt systemd-logind in Aktion. Dieser Dienst ist verantwortlich für das Tracking von Benutzersitzungen, das Verwalten von “Seats” (Hardware-Zuweisung) und das automatische Aufräumen von Prozessen nach dem Logout. In RHEL ist logind zudem eng mit dem Power-Management (Shutdown/Suspend) verknüpft. Wer logind beherrscht, kann verhindern, dass verwaiste Benutzersitzungen den Server ausbremsen.


# 1. Einführung & Architektur

Der Tracker der User.

Logind ist ein Hintergrunddienst, der Informationen über angemeldete Benutzer bereitstellt.

# Die logind-Kette (Mermaid)

graph LR
    A[SSH Login / TTY] --> B[PAM: pam_systemd.so]
    B --> C[systemd-logind]
    C --> D[Create Session ID]
    C --> E[Assign User Slice / Cgroups]
    C --> F[Manage Seats / Inhibit Locks]
    G[loginctl] -->|Query| C

# 2. loginctl: Das Interface für den Admin

Sitzungen überwachen.

Das Werkzeug loginctl erlaubt die Interaktion mit dem Dämon.

# Aktive Sitzungen anzeigen

loginctl list-sessions
# OUTPUT: SESSION  UID USER  SEAT  TTY
#         1        1000 admin seat0 tty1

# Details zu einem User

loginctl user-status admin

Hier sehen Sie alle Prozesse, die aktuell zur Session dieses Benutzers gehören, gruppiert in einer Cgroup.


# 3. Konfiguration für Server (logind.conf)

Den Standard anpassen.

Die Datei /etc/systemd/logind.conf steuert das Verhalten bei Logins und Power-Events.

# Beispiel: Prozesse beim Logout killen

Standardmäßig erlaubt systemd, dass Prozesse (wie screen oder tmux) weiterlaufen. In hochsicheren Umgebungen will man das oft unterbinden.

[Login]
# Killt alle User-Prozesse nach dem Logout (Vorsicht: bricht tmux!)
KillUserProcesses=yes
# Verhindert, dass der Server bei Druck auf den Power-Button sofort ausgeht
HandlePowerKey=ignore

# 4. Day-2 Operations: Lingering & Sessions

Dienste am Leben erhalten.

Wie bereits in Artikel 011 erwähnt, ist Lingering die wichtigste Einstellung für Service-Accounts.

# User-Session “festpinnen”

# Erlaubt dem User, Prozesse auch ohne aktive Sitzung laufen zu lassen
sudo loginctl enable-linger serviceuser

# Sitzungen beenden

# Beendet eine hängende SSH-Sitzung sofort
sudo loginctl terminate-session 1

# 5. Troubleshooting & “War Stories”

Wenn die Sitzung hängen bleibt.

# Story 1: “Der Server fährt nicht runter”

Symptom: systemctl reboot dauert 90 Sekunden und bricht dann ab, oder der Server schaltet sich nicht aus. Ursache: Ein Prozess (oft eine VM oder ein DB-Dienst) hält einen “Inhibit Lock”. Er sagt systemd-logind: “Ich bin noch nicht fertig, bitte warte.” Lösung: Finden Sie den Lock:

loginctl list-inhibitors

Beenden Sie den blockierenden Prozess manuell.

# Story 2: “User-Prozesse werden zufällig gekillt”

Symptom: Ein Admin startet ein langes Skript in einer SSH-Session. Nach dem Logout des Admins wird das Skript beendet, obwohl es im Hintergrund laufen sollte. Ursache: In RHEL ist oft KillUserProcesses=yes gesetzt (oder die Applikation ist nicht korrekt in der Cgroup isoliert). Lösung: Nutzen Sie systemd-run --scope --user my-script.sh oder aktivieren Sie Lingering für den User.


# 6. Fazit & Empfehlung

  • Audit: Nutzen Sie loginctl list-users, um zu sehen, wer wirklich eingeloggt ist (besser als who).
  • Sicherheit: Deaktivieren Sie das Handling des Power-Keys auf Rack-Servern, um versehentliches Ausschalten zu verhindern.
  • Performance: logind nutzt Cgroups, um User voneinander zu trennen. Das verhindert, dass ein User alle CPU-Ressourcen des Hosts frisst.

# Anhang: Cheatsheet

Aufgabe Befehl
Alle User listen loginctl list-users
Session-Details loginctl show-session <id>
Lingering Status ls /var/lib/systemd/linger/
Seat Status loginctl list-seats
Alle Sitzungen eines Users killen loginctl terminate-user <name>
Locks anzeigen loginctl list-inhibitors