[[Vorlage(Getestet, jammy, focal)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis()]] [:systemd:] User Units unterscheiden sich von "normalen" [:systemd/Units: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 [:Howto/systemd_Service_Unit_Beispiel: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 [#Beispiele ü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: {{{#!vorlage Befehl 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 [:systemd/systemctl/#Bearbeiten-von-Unit-Dateien: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 [:systemd/systemctl:systemctl], aber man benötigt keine Root-Rechte, fügt dafür aber die Option `--user` hinzu. Der folgende Befehl {{{#!vorlage 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 [#User-Units-ohne-Anmeldung-starten enable-linger] oder die Anpassung des Werts `KillUserProcesses=...`in der Konfigurationsdatei [https://www.freedesktop.org/software/systemd/man/logind.conf.html# logind.conf] {en} ändern. === Umgebungsvariablen === Auch, wenn User Units erst beim Anmelden ausgeführt werden, liest systemd nicht die Konfigurationsdateien des Nutzers wie z.B. [:Bash/bashrc:.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 [:systemd/journald:journald:] in den systemweiten Log. Um die Logs von den eigenen User Units gezielt abzufragen, ruft man [:systemd/journalctl:journalctl] ebenfalls mit der Option `--user` auf: {{{#!vorlage Befehl 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 [https://www.freedesktop.org/software/systemd/man/loginctl.html systemd loginctl] {en} möglich. Der folgende Befehl aktiviert dieses Verhalten für den Nutzer `NUTZER`[1][2] {{{#!vorlage Befehl sudo loginctl enable-linger NUTZER }}} Deaktiviert wird es über: {{{#!vorlage Befehl sudo loginctl disable-linger NUTZER }}} = Beispiele = == Automatisches Starten einer graphischen Anwendung == Folgende Units bewirken das [:Signal_Desktop/#Gekoppelte-Geraete: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 [mark]signal-desktop[/mark] [Install] }}} [mark]Dateiname des Starters[/mark] (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: {{{#!vorlage Befehl 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. }}} = Links = * [:systemd:] {Übersicht} - Übersicht über die systemd Artikel hier im Wiki * [archwiki:Systemd/User:Artikel im Arch Wiki] zu User Units #tag: System, systemd