
Ich muss einfach einen systemd-Benutzerdienst ausführen, der Zugriff auf alle Umgebungsvariablen hat, die von der DBus-Benutzersitzung bereitgestellt werden. Hier ist meine Beispieleinheit:
[Unit]
Description=Environment Demo
[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=/bin/bash -c 'env > shell.env.sh'
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=default.target
Die exportierten Schlüssel sind:
_
DISPLAY
HOME
LANG
LOGNAME
MANAGERPID
PATH
PWD
SHELL
SHLVL
USER
XDG_RUNTIME_DIR
Dies ist weit entfernt von der vollständigen Liste der Umgebungsvariablen, die vorhanden sind, wenn ich eine Desktop-Anwendung aus meiner Taskleiste oder meinem Launcher starte (ich verwende elementary OS Loki, auch bekannt als Ubuntu 16.04 xenial). Wenn ich meinen Terminalemulator ( pantheon-terminal
) starte und eine sortierte Liste meiner Umgebungsvariablen erhalte, erhalte ich Folgendes:
_
DBUS_SESSION_BUS_ADDRESS
DEFAULTS_PATH
DESKTOP_SESSION
DISPLAY
EDITOR
GDM_LANG
GDMSESSION
GIO_LAUNCHED_DESKTOP_FILE
GIO_LAUNCHED_DESKTOP_FILE_PID
GNOME_DESKTOP_SESSION_ID
GPG_TTY
GSETTINGS_SCHEMA_DIR
GTK_CSD
GTK_MODULES
HOME
LANG
LANGUAGE
LESSCLOSE
LESSOPEN
LOGNAME
LS_COLORS
MANDATORY_PATH
PANTHEON_TERMINAL_ID
PATH
PROMPT_COMMAND
PWD
QT_ACCESSIBILITY
QT_IM_MODULE
QT_LINUX_ACCESSIBILITY_ALWAYS_ON
QT_STYLE_OVERRIDE
SESSION_MANAGER
SHELL
SHLVL
SSH_AGENT_PID
SSH_AUTH_SOCK
TERM
USER
VTE_VERSION
XAUTHORITY
XDG_CONFIG_DIRS
XDG_CURRENT_DESKTOP
XDG_DATA_DIRS
XDG_GREETER_DATA_DIR
XDG_MENU_PREFIX
XDG_RUNTIME_DIR
XDG_SEAT
XDG_SEAT_PATH
XDG_SESSION_DESKTOP
XDG_SESSION_ID
XDG_SESSION_PATH
XDG_SESSION_TYPE
XDG_VTNR
XMODIFIERS
Um die Dinge klarer zu machen:
diff --git a/systemd-user.env.txt b/pantheon-terminal.env.txt
index c684056..f6d0685 100644
--- a/systemd-user.env.txt
+++ b/pantheon-terminal.env.txt
@@ -1,12 +1,54 @@
_
+DBUS_SESSION_BUS_ADDRESS
+DEFAULTS_PATH
+DESKTOP_SESSION
DISPLAY
+EDITOR
+GDM_LANG
+GDMSESSION
+GIO_LAUNCHED_DESKTOP_FILE
+GIO_LAUNCHED_DESKTOP_FILE_PID
+GNOME_DESKTOP_SESSION_ID
+GPG_TTY
+GSETTINGS_SCHEMA_DIR
+GTK_CSD
+GTK_MODULES
HOME
LANG
+LANGUAGE
+LESSCLOSE
+LESSOPEN
LOGNAME
-MANAGERPID
+LS_COLORS
+MANDATORY_PATH
+PANTHEON_TERMINAL_ID
PATH
+PROMPT_COMMAND
PWD
+QT_ACCESSIBILITY
+QT_IM_MODULE
+QT_LINUX_ACCESSIBILITY_ALWAYS_ON
+QT_STYLE_OVERRIDE
+SESSION_MANAGER
SHELL
SHLVL
+SSH_AGENT_PID
+SSH_AUTH_SOCK
+TERM
USER
+VTE_VERSION
+XAUTHORITY
+XDG_CONFIG_DIRS
+XDG_CURRENT_DESKTOP
+XDG_DATA_DIRS
+XDG_GREETER_DATA_DIR
+XDG_MENU_PREFIX
XDG_RUNTIME_DIR
+XDG_SEAT
+XDG_SEAT_PATH
+XDG_SESSION_DESKTOP
+XDG_SESSION_ID
+XDG_SESSION_PATH
+XDG_SESSION_TYPE
+XDG_VTNR
+XMODIFIERS
Wenn Sie etwas auf diese Weise starten, sind etwa 30 weitere Umgebungsvariablen erforderlich.
Mein Anwendungsfall ist folgender: Ich möchte Prozesse mit einer vollständigen Umgebung starten können, wie beim Starten meiner Terminalanwendung.
Wie kann ich meinen Systemd-Benutzerdaemons eine vollständigere Umgebung zugänglich machen?
Antwort1
Vielleicht finden Sie Hilfe in derArchLinux-Wiki-SeiteHier wird das Einstellen der Umgebung für Benutzereinheiten erläutert. Insbesondere
systemctl --user import-environment
exportiert alle aktuellen Umgebungsvariablen in Ihre systemd-Benutzerumgebung. Sie können stattdessen eine explizite Liste von Variablen angeben. Sie können dies überprüfen, indem Sie ausführen
systemctl --user show-environment
vorher und nachher. Es gibt auch
systemctl --user set-environment MYVAR=myvalue ...
systemctl --user unset-environment MYVAR ...
Siehe systemctl
Manpage. Das Wiki erwähnt auch eine Dbus-spezifische Alternative, mit der ich weniger Erfolg hatte:
dbus-update-activation-environment --systemd --all
Antwort2
Meine Lösung berücksichtigt die obige Lösung von @meuh und einige Recherchen.
Der erste Schritt besteht darin, eine Dummy-Benutzereinheit mit dem Namen zu erstellen dbus-environment.service
:
[Unit]
Description=Environment Imported Target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
Der nächste Schritt besteht darin, ein Bash-Skript zu erstellen:
#!/bin/bash
systemctl --user import-environment
systemctl --user start dbus-environment.service
Fügen Sie als Nächstes dieses Skript zu den Startanwendungen Ihres Fenstermanagers hinzu, die garantiert innerhalb der DBUS-Sitzung und des Fenstermanagers, X usw. ausgeführt werden.
Beim Anmelden zur Sitzung wird das Skript aufgerufen und importiert alles in den Systemd-Benutzerdaemon.
Als nächstes lassen Sie alle Einheiten, die von diesen Umgebungsvariablen abhängen, einfach von Folgendem abhängig sein dbus-environment.service
:
[Unit]
Description=Duplicity Backup Service
Requires=dbus-environment.service
After=dbus-environment.service
[Service]
Type=oneshot
ExecStart=/home/naftuli/.local/bin/duply home backup
Wenn dieser Dienst jetzt gestartet wird, ist garantiert, dass die Umgebung importiert ist. Vielleicht sollte ich ein Ziel statt eines Dienstes verwenden, aber das muss warten.
Antwort3
@Naftuli: Wäre es nicht besser gewesen, stattdessen so etwas in allen Unit-Dateien Ihrer Dienste zu verwenden?
ExecStartPre=\usr\bin\sh -c "systemctl --user import-environment"