システムユーザーモードで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 Wikiページユーザー組織の環境設定について説明します。特に、

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"

関連情報