ubuntuusers.de

User Units

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

systemd User Units unterscheiden sich von "normalen" Units nur in so fern, dass die Units nicht beim Systemstart mit gestartet werden, sondern erst wenn der Nutzer, für den die Unit aktiviert ist, sich auf dem System anmeldet. Dabei spielt es keine Rolle, ob die Anmeldung lokal direkt am Rechner erfolgt oder von außerhalb, z.B. über SSH. Die Unit wird automatisch wieder beendet, wenn der Nutzer vom System vollständig abgemeldet ist.

Ein Beispiel für eine User Unit - welche auch standardmäßig bei Ubuntu aktiviert ist - ist das Löschen aller temporärer Dateien, die vom System angelegt werden, so lange ein Nutzer angemeldet ist.

Benutzung

User Units funktionieren grundsätzlich genau so wie systemweite Units, auch die entsprechenden Unit-Dateien sind identisch aufgebaut. Details hierzu sind im Wikiartikel systemd/Units zu finden.

User Units laufen standardmäßig mit den Rechten des Nutzer, für den die Unit gestartet wird.

Sichtbarkeit für andere Nutzer

Auch, wenn eine User Unit beim Anmelden für einen Nutzer gestartet wird, läuft die Unit nicht exklusiv oder gekapselt für diesen Nutzer. Startet man z.B. den im Unit Howto genutzten Server als User Unit, können auch alle anderen am System angemeldeten Nutzer auf den Server zugreifen.

Programme mit grafischer Oberfläche Starten

systemd ist grundsätzlich dafür gemacht, Dienste und Prozesse im Hintergrund zu starten. Es ist nicht dafür gemacht, Programme mit grafischer Oberfläche im Vordergrund zu starten. Technisch ist dies zwar über ein paar "Umwege" möglich, aber der bessere Weg zum Starten von grafischen Programmen nach dem Anmelden im System sind nach wie vor die Autostart-Mechanismen der verschiedenen Desktopumgebungen.

Speicherorte

Dateien für User Units können unter Ubuntu an vielen Stellen im Dateisystem abgelegt werden, der folgende Befehl listet diese Ordner auf:

systemd-analyze --user unit-paths 

Die wichtigsten und häufig verwendeten Orte sind:

  • /usr/lib/systemd/user: Hier liegen alle vorinstallierten Dateien für User Units, die von allen Benutzern verwendet werden können.

  • /etc/systemd/user: Hier liegen Units, welche selber angelegt wurden und für jeden Nutzer des Systems aktiviert werden können. Für das Anlegen oder Editieren von Units in diesem Verzeichnis sind Root-Rechte notwendig.[2]

  • ~/.local/share/systemd/user: Hier liegen Units von Paketen, die lokal nur für den einzelnen Benutzer installiert sind.

  • ~/.config/systemd/user: Hier liegen alle Dateien von User Units, welche durch den jeweiligen Benutzer selbst angelegt oder editiert wurden. Änderungen sind nur für Units in /usr/lib/systemd/user möglich, nicht für systemweite Units. Da die entsprechenden Dateien unterhalb des Homeverzeichnisses des Benutzers liegen, sind hierfür keine Root-Rechte erforderlich.

Die Priorität von Units im Homeverzeichnis ist höher als die in den systemweiten Verzeichnissen, d.h. gibt es eine gleichnamige Unit z.B. in /etc/systemd/user und ~/.config/systemd/user, dann hat die in letzterem Verzeichnis die höhere Priorität und wird geladen.

eigene User Units anlegen

Das Anlegen eigener User Units erfolgt genau so wie im systemctl-Artikel beschrieben, es gelten die gleiche Sektionen und Direktiven in den verschiedenen Units. In der [Install]-Sektion der Unit wird üblicherweise (aber nicht zwingender Weise) WantedBy=default.target angegeben, da alle anderen, früheren Targets, in der Regel bereits erreicht sind, wenn man sich als Nutzer anmelden kann.

Das Aktivieren, Deaktivieren etc. von User Units erfolgt ebenfalls mittels systemctl, aber man benötigt keine Root-Rechte, fügt dafür aber die Option --user hinzu. Der folgende Befehl

systemctl --user enable meine_unit.service 

würde z.B. die Service-Unit meine_unit als User Unit aktivieren.

Interaktion mit System Units

In der Standardkonfiguration werden User Units erst gestartet, wenn alle System Units bereits laufen, weil sich der Nutzer erst anmelden kann, wenn das System komplett gestartet ist. Von daher machen Direktiven wie After=... auf bestimmte Units oder Targets, die beim Starten des Systems abgearbeitet werden, in der Regel keinen Sinn.

Des Weiteren werden beim Herunterfahren des Systems erst die User Units beendet, bevor die System Units abgearbeitet werden bzw. Targets des Herunterfahrens erreicht werden. Von daher machen auch Direktiven auf solche Targets in User Units in der Regel keinen Sinn.

Man kann das Verhalten von User Units aber mit enable-linger oder die Anpassung des Werts KillUserProcesses=...in der Konfigurationsdatei logind.conf 🇬🇧 ändern.

Umgebungsvariablen

Auch, wenn User Units erst beim Anmelden ausgeführt werden, liest systemd nicht die Konfigurationsdateien des Nutzers wie z.B. .bashrc ein. Damit haben die gestarteten Prozesse auch keinen Zugriff auf die Umgebungsvariablen des Nutzer. Werden Umgebungsvariablen benötigt, so sind diese wie im Artikel systemd/Umgebungsvariable beschrieben zu setzen.

Logs zu User Units

User Units schreiben standardmäßig ihre Ausgaben / Logs ebenfalls über journald: in den systemweiten Log. Um die Logs von den eigenen User Units gezielt abzufragen, ruft man journalctl ebenfalls mit der Option --user auf:

journalctl --user 

Ansonsten gelten die gleichen Optionen wie im journalctl Wikiartikel beschrieben.

User Units ohne Anmeldung starten

Besteht die Notwendigkeit, dass für einen Nutzer User Units beim Systemstart - also ohne Anmeldung des Nutzers am System - gestartet werden bzw. User Units auch nach dem Abmelden weiterlaufen statt beendet werden, ist dies über systemd loginctl 🇬🇧 möglich.

Der folgende Befehl aktiviert dieses Verhalten für den Nutzer NUTZER[1][2]

sudo loginctl enable-linger NUTZER 

Deaktiviert wird es über:

sudo loginctl disable-linger NUTZER 

Beispiele

Automatisches Starten einer graphischen Anwendung

Folgende Units bewirken das Vermeiden der Entkopplung von Signal Desktop ca. alle 10 Tage.

~/.config/systemd/user/signal-desktop.service :

[Unit]
Description=Start Signal Desktop GUI
Requires=default.target

[Service]
Type=forking
ExecStart=/usr/bin/gtk-launch signal-desktop

[Install]

Dateiname des Starters (ohne .desktop) in /usr/share/applications/.

~/.config/systemd/user/signal-desktop.timer :

[Unit]
Description=Timer for Signal Desktop GUI

[Timer]
OnCalendar=*-*-3/10 05:00:00
Persistent=true
Unit=signal-desktop.service

[Install]
WantedBy=default.target

Aktivierung:

systemctl --user enable signal-desktop.timer 
systemctl --user start signal-desktop.timer  # nur nötig, wenn der Timer sofort, also schon vor dem nächsten Ab-/Anmelden, loslegen soll. 

Diese Revision wurde am 25. November 2023 12:51 von noisefloor erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: System, systemd