我在systemd的用戶空間中寫了一個服務文件來啓動emacs守護進程。這工作得很好。但在啓動emacsclient時,我讓我的日記文件解密。爲此我運行gpg-agent。通常當emacs啓動時,pineentry-gtk彈出並提示我輸入我的私鑰密碼。但是使用systemd啓動守護進程,環境變量$ SSH_AUTH_SOCKET,$ GPG_AGENT_INFO和SSH_AGENT_PID未知。因此,沒有pineentry-gtk彈出。幾種從系統周圍系統進料的方法都陷入困境。我想用一種動態的方法而不是絕對路徑。
我定義了一個systemd EnvironmentFile和擺在那裏
SSH_AUTH_SOCKET=${SSH_AUTH_SOCKET}
,並列入emacs.sevice文件。在這裏調查我發現 this鏈接,無法想象這是真的。這意味着在環境文件中設置服務/單元文件中的環境設置是另一回事。他們看不到對方。什麼意義,然後一個環境文件?
下一步是從我的登錄時間sourced〜/ .bash_profile像這樣導入環境變量。
systemctl --user import-environment GPG_AGENT_INFO
systemctl --user import-environment SSH_AUTH_SOCKET
systemctl --user import-environment SSH_AGENT_PID
登錄後我看了一下,看看systemd是否有環境變量。我通過輸入得到了這個
systemctl --user show-environmet
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
GPG_AGENT_INFO=${GPG_AGENT_INFO}
HOME=/home/xxxx
LANG=de_DE.UTF-8
LOGNAME=xxxx
PATH=/home/xxxx/bin:~/.emacs.d/shell-scripts: .........
AUTH_SOCK=${SSH_AUTH_SOCKET}
USER=xxxx
XDG_RUNTIME_DIR=/run/user/1000
但是在systemd環境中啓動emacs守護進程顯示了同樣的症狀。
下一步是像這樣直接在單元/服務文件中導入變量。
[Unit]
Description=Emacs: the extensible, self-documenting text editor
[Service]
# loading default environment for systemd in user space
EnvironmentFile=%h/.config/systemd/xxxx-default-evironment.env
Type=forking
ExecStartPre=/bin/systemctl --user import-environment SSH_AUTH_SOCKET
ExecStart=/usr/bin/emacs --daemon
ExecStartPost=/bin/systemctl --user set-environment SSH_AUTH_SOCK=${SSH_AUTH_SOCK}
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Restart=always
[Install]
WantedBy=non-graphical.target
這種方法也沒有成功。順便說一下,我們不能相信發佈SYSTEM到SYSTEM(D)的一些環境變量是非常困難的。
任何答案都是非常受歡迎的。
感謝 福爾克
您是否嘗試過使用https://github.com/purcell/exec-path-from-shell包導入您的環境變量? –