시스템 사용자 모드에서 DBus 세션 애플리케이션 시작

시스템 사용자 모드에서 DBus 세션 애플리케이션 시작

사용자의 DBus 세션에서 제공하는 모든 환경 변수에 액세스하여 시스템 사용자 서비스를 실행해야 한다는 간단한 요구가 있습니다. 내 예제 단위는 다음과 같습니다.

[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

내보낸 키는 다음과 같습니다.

_
DISPLAY
HOME
LANG
LOGNAME
MANAGERPID
PATH
PWD
SHELL
SHLVL
USER
XDG_RUNTIME_DIR

트레이나 실행기에서 데스크탑 애플리케이션을 실행하는 경우(Ubuntu 16.04 xenial이라고도 알려진 Elementary OS Loki를 사용하고 있음) 이는 존재하는 환경 변수의 전체 목록과는 거리가 멀습니다. 터미널 에뮬레이터( )를 실행 pantheon-terminal하고 정렬된 환경 변수 목록을 얻으면 다음과 같은 결과가 나타납니다.

_
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

상황을 더 명확하게 하려면:

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

이런 방식으로 시작하면 아마도 30개의 환경 변수가 더 있을 것입니다.


내 사용 사례는 다음과 같습니다. 터미널 애플리케이션을 시작하는 컨텍스트에서처럼 전체 컨텍스트에서 프로세스를 시작할 수 있기를 원합니다.

시스템 사용자 데몬에 전체 환경을 어떻게 노출합니까?

답변1

다음에서 도움을 받으실 수 있습니다.ArchLinux 위키 페이지사용자 조직의 환경 설정에 대해 설명합니다. 특히,

systemctl --user import-environment 

모든 현재 환경 변수를 시스템 사용자 환경으로 내보냅니다. 대신 명시적인 변수 목록을 제공할 수 있습니다. 다음을 실행하여 확인할 수 있습니다.

systemctl --user show-environment

이전과 이후. 게다가

systemctl --user set-environment MYVAR=myvalue ...
systemctl --user unset-environment MYVAR ...

systemctl매뉴얼 페이지를 참조하십시오 . 위키에는 dbus 관련 대안도 언급되어 있지만 성공률은 낮았습니다.

dbus-update-activation-environment --systemd --all

답변2

내 솔루션은 위의 @meuh의 솔루션과 일부 파기를 고려했습니다.

첫 번째 단계는 다음과 같은 더미 사용자 단위를 만드는 것입니다 dbus-environment.service.

[Unit]
Description=Environment Imported Target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true

다음 단계는 Bash 스크립트를 만드는 것입니다.

#!/bin/bash

systemctl --user import-environment
systemctl --user start dbus-environment.service

다음으로 이 스크립트를 창 관리자의 시작 응용 프로그램에 추가하여 DBUS 세션과 창 관리자, X 등에서 모두 실행되도록 합니다.

세션 로그인 시 이 스크립트가 호출되어 모든 것을 systemd 사용자 데몬으로 가져옵니다.

다음으로, 이러한 환경 변수에 의존하는 모든 유닛에 대해 다음에 의존하도록 만듭니다 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

이 시점에서 서비스가 시작되면 환경 가져오기가 보장됩니다. 서비스 대신 대상을 사용해야 할 수도 있지만 이 연습은 기다려야 합니다.

답변3

@Naftuli: 모든 서비스 단위 파일에서 이와 같은 것을 사용하는 것이 더 좋지 않을까요?

ExecStartPre=\usr\bin\sh -c "systemctl --user import-environment"

관련 정보