我在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包导入您的环境变量? –