【发布时间】:2017-07-30 15:49:32
【问题描述】:
我在 systemd 的用户空间写了一个服务文件来启动 emacs 守护进程。这工作得很好。但是在 emacsclient 启动时,我让我解密了我的日记文件。为此,我正在运行 gpg-agent。通常当 emacs 启动时,pineentry-gtk 会弹出并提示我输入我的私钥密码。但是使用 systemd 启动守护程序,环境变量 $SSH_AUTH_SOCKET、$GPG_AGENT_INFO 和 SSH_AGENT_PID 是未知的。因此没有 pineentry-gtk 弹出。从系统周围馈送 systemd 的几种方法被卡住了。我想使用动态方法而不是放入绝对路径。
我定义了一个 systemd EnvironmentFile 并放在那里
SSH_AUTH_SOCKET=${SSH_AUTH_SOCKET}
并将文件包含在 emacs.sevice 中。在这里调查我发现了 this 链接,无法想象这是真的。这意味着服务/单元文件中的环境设置与在环境文件中设置它是另一回事。他们看不见对方。那么一个环境文件有什么意义呢?
下一步是从我的登录时导入环境变量 ~/.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)这么难。
非常欢迎任何答案。
谢谢 法尔克
【问题讨论】:
-
您是否尝试过使用github.com/purcell/exec-path-from-shell 包导入环境变量?
-
我对 systemd 了解不多,但我想在您的
.bashrc中运行systemctl --user import-environment比 systemd 启动 Emacs 发生的时间晚?在这种情况下它没有用,因为 Emacs 已经获得了它的环境,它不会包含这些值?
标签: service emacs environment gnupg systemd