
Tengo una simple necesidad de ejecutar un servicio de usuario systemd con acceso a todas las variables de entorno proporcionadas por la sesión DBus del usuario. Aquí está mi unidad de ejemplo:
[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
Las claves exportadas son:
_
DISPLAY
HOME
LANG
LOGNAME
MANAGERPID
PATH
PWD
SHELL
SHLVL
USER
XDG_RUNTIME_DIR
Esto está muy lejos de la lista completa de variables de entorno presentes si ejecuto una aplicación de escritorio desde mi bandeja o desde mi iniciador (estoy en el sistema operativo elemental Loki, también conocido como Ubuntu 16.04 xenial). Si ejecuto mi emulador de terminal ( pantheon-terminal
) y obtengo una lista ordenada de mis variables de entorno, obtengo lo siguiente:
_
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
Para dejar las cosas más claras:
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
Hay alrededor de 30 variables de entorno más cuando se inicia algo de esta manera.
Mi caso de uso es el siguiente: quiero poder iniciar procesos con un entorno completo, como en el contexto del inicio de mi aplicación de terminal.
¿Cómo puedo exponer un entorno completo (más) a mis demonios de usuario systemd?
Respuesta1
Puede que encuentres ayuda en elPágina wiki de ArchLinuxque analiza la configuración del entorno para las unidades de usuario. En particular,
systemctl --user import-environment
exportará todas las variables de entorno actuales a su entorno de usuario systemd. En su lugar, puede proporcionar una lista explícita de variables. Puedes comprobarlo ejecutando
systemctl --user show-environment
antes y después de. También hay
systemctl --user set-environment MYVAR=myvalue ...
systemctl --user unset-environment MYVAR ...
Vea la systemctl
página de manual. La wiki también menciona una alternativa específica de dbus con la que tuve menos éxito:
dbus-update-activation-environment --systemd --all
Respuesta2
Mi solución tiene en cuenta la solución anterior de @meuh y algunas investigaciones.
El primer paso es crear una unidad de usuario ficticia llamada dbus-environment.service
:
[Unit]
Description=Environment Imported Target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
El siguiente paso es crear un script Bash:
#!/bin/bash
systemctl --user import-environment
systemctl --user start dbus-environment.service
A continuación, agregue este script a las aplicaciones de inicio de su administrador de ventanas que se garantiza que se ejecutarán dentro de la sesión DBUS y el administrador de ventanas, X, etc.
Al iniciar sesión, se llamará al script, importando todo al demonio de usuario systemd.
A continuación, para todas las unidades que dependen de estas variables de entorno, simplemente haga que dependan de 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
En este punto, cuando se inicia este servicio, se garantiza que se importará el entorno. Quizás debería utilizar un objetivo en lugar de un servicio, pero ese ejercicio tendrá que esperar.
Respuesta3
@Naftuli: ¿No hubiera sido mejor usar algo como esto en todos los archivos de tu unidad de servicios?
ExecStartPre=\usr\bin\sh -c "systemctl --user import-environment"