Desktop-Programm beim Log-in als systemd-Service starten
Dieser Artikel beschreibt, wie man einen benutzerspezifischen systemd-Service beim Log-in automatisch ausführen lässt, um ein Desktop-Programm (mit GUI) auszuführen.
Ich lasse den Matrix-Client "Element-Desktop" normalerweise beim Starten des Systems minimiert, wo er dann im Benachrichtigungsbereich ("SysTray") residiert, bis ich in meine Nachrichten schauen möchte.
Dazu stellt man im Menüpunkt "Start- und Fensterverhalten" der Element-Desktop-Einstellungen bei "Öffne Element, wenn du dich an deinem Computer anmeldest" auf "Minimiert".
Sobald man diese Einstellung vornimmt, erzeugt Element-Desktop eine entsprechende Starter-Datei namens "element-desktop.desktop" im benutzerspezifischen Autostart-Ordner ~/.config/autostart
Diese sieht dann in etwa so aus:
[Desktop Entry]
Type=Application
Version=1.0
Name=element-desktop
Comment=element-desktopstartup script
Exec=/usr/bin/element-desktop --hidden
StartupNotify=false
Terminal=false
Element-Desktop basiert allerdings auf dem freien, plattformübergreifenden Electron-Framework, welches als Abhängigkeit mitinstalliert, aktualisiert und bei Ausführung von Element-Desktop dann zur Laufzeit im Hintergrund verwendet wird.
Aus irgendeinem Grund, schreibt das aktuelle Element-Desktop bei mir auf Arch/-Derivaten die Exec-Zeile neuerdings allerdings beim Aktivieren von "Minimiert" starten um:
Exec=/usr/lib/electron38/electron
Das sieht dann so aus, dass ein blankes Electron beim Login der Benutzer-Session erscheint – und sonst nichts mehr:
Hinweis: Element-Desktop ist bei mir aus nativen Paketen der jeweiligen Distribution installiert, also keine Container-Formate à la Flatpak etc.
Die Lösung ist nun, einen systemd-Dienst so zu konfigurieren, dass er beim Log-in in die Benutzer-Sitzung jeweils das Programm Element-Desktop startet. Daher kann man als Erstes das minimierte Starten herausnehmen, da es ohnehin nicht funktioniert. Dazu "Öffne Element, wenn du dich an deinem Computer anmeldest" auf "Nein" umstellen.
-
Eine Service-Datei (Klartext) erstellen, bei mir:
~/.config/systemd/user/element_minimized_starter.service -
Inhalt der Datei:
[Unit]
Description=Script Service for starting Element-Desktop
After=graphical-session.target
[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/bin/element-desktop
Restart=no
StandardOutput=null
[Install]
WantedBy=graphical-session.target
Prinzipiell ließe sich übrigens analog auch jedes beliebige Skript auf diese Weise ausführen, man ist hier nicht auf GUI (oder CLI)-Programme beschränkt.
- Das Ganze lässt sich nun testen mit
systemctl --user start element_minimized_starter
Hinweis: Obwohl die obige Service-Datei "element_minimized_starter.service" lautet, kann man sich die Extension an dieser Stelle sparen, das macht systemd automatisch.
Der hier verwendete Schalter "--user" steuert benutzerspezifische Dienste (läuft nur im Kontext des eingeloggten Benutzers, ohne Root-Rechte). Der Aufruf von "systemctl" (ohne Schalter "--user") steuert systemweite Dienste (läuft unter Root, betrifft alle Benutzer).
Test: ein Blick in den Benachrichtigungsbereich → wird das Programm tatsächlich ausgeführt? Das Programmsymbol sollte geladen sein und beim Klick darauf das Programm in den Vordergrund bringen.
Der Status des Dienstes lässt jederzeit abfragen via systemctl --user status element_minimized_starter
- Der Dienst wurde so nur einmalig zum Testen gestartet. So automatisiert man den Dienst:
systemctl --user enable element_minimized_starter
Analoges Stoppen des Dienstes via systemctl --user stop element_minimized_starter und Entfernen des Dienstes mit systemctl --user disable element_minimized_starter.
Zur Dienst-Datei lässt sich anmerken, dass er erst beim Erreichen der grafischen Oberfläche gestartet werden soll, da es sich um ein Desktop-Programm handelt. Daher ist zu setzen: After=graphical-session.target
Für ein einfaches Shell-Script beispielsweise, würde es After=default.target tun.
Das Logging lässt sich in der Einstellung "StandardOutput" einstellen, z.b. StandardOutput=append:%h/systemd-user-log.txt
Diese Einstellung schreibt dann (jeweils hinzufügend) in die angegebene Datei im Home-Verzeichnis des eingeloggten Benutzers.
Verwendete Versionen
- KDE Plasma Desktop 6.5.3
- Element-Desktop 1.12.3
- Electron 38.7.2 (wird von Element-Desktop benötigt)
Quellen:
[Artikel "Matrix/Element.io - Endlich eine freie Alternative zu Discord?"](https://gnulinux.ch/matrix-element-io-endlich-eine-freie-alternative-zu-discord)






Ich hab nicht ganz verstanden, warum du nicht einfach die autostart-Datei anpasst, so wie du sie brauchst? Dann die Datei ggf. readonly setzen um sie vor überschreiben zu schützen.
Und in deiner service-Datei finde ich keine Anweisung zum minimierten Start, wie geschieht das dann? Hab ich was übersehen?
Normales Autostart verwenden hatte nichts gebracht, ebenso das Anpassen der Exec-Zeile; außerdem hat Element meine angepasste Datei sowieso bei jedem Aus/Ein der "automatisch Starten" Funktion überschrieben.
Anscheinend startet SystemD mein Desktop-Programm schon in den Hintergrund, daher kein "--minimized" mehr notwendig. Im Gegenteil, wenn ich das nutze, wird das Icon zwar auch geladen, aber der erste Klick darauf ist ohne Wirkung! Muss dann immer zwei mal Klicken.
Mysteriös! Danke für die Rückmeldung.
Interessant was so möglich ist. Ich sehe für mich nicht den Mehrwert bei dem Aufwand der dafür notwendig ist.
Leider habe ich das gebraucht, da ich das Icon gerne für meine Messenger im Autostart/SysTray habe. Es ging nur via SystemD. Mag ja bald gefixed werden, es ging ja vorher auch.
Systemd oder systemd. Aber nicht SystemD oder systemD.