在 systemd 中传递环境变量

the*_*ang 6 linux environment-variables systemd

EnvironmentFile根据这个答案不是一个选项。

我试图了解使用和传递环境变量的推荐方式。

我有一个urxvtd.socket

[Unit]
Description=urxvt deamon (socket activation)
Documentation=man:urxvtd(1) man:urxvt(1)

[Socket]
ListenStream=%t/urxvt/urxvtd-%H

[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)

现在urxvtd.socketRequires上urxvtd.socket依赖性:

[Unit]
Description=Urxvt Terminal Daemon
Requires=urxvtd.socket

[Service]
# Needs to know socket file location RXVT_SOCKET environment variable.
# Where will it come from?
ExecStart=/usr/bin/urxvtd -o -q

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

现在我需要RXVT_SOCKET在启动 i3 之前进行设置,因为 i3 将有一个键绑定要启动urxvtc(urxvt 客户端)。

如果我在没有 systemd(即使用 xinitrc)的情况下启动 i3/Xorg,并放入.zshenv(始终加载用户特定的环境文件。):

export RXVT_SOCKET=${XDG_RUNTIME_DIR}/urxvt/urxvtd-machinename
Run Code Online (Sandbox Code Playgroud)

然后urxvtc由 i3 启动将正确推断 RXVT_SOCKET 变量并在该路径上查找套接字。

然而,urxvtd.service启动urxvtd(守护进程),所以它也需要RXVT_SOCKET。

Archwiki 建议将环境设置为urxvtd.service

...
Environment=RXVT_SOCKET=%t/urxvtd-%H
...
Run Code Online (Sandbox Code Playgroud)

但问题就在于此。为什么要在urxvtd.service初始用户urxvtd.socket设置时再次设置环境变量?

请注意,它再次设置.zshenv为 i3 以获取它。这是一个简单环境变量的多个真实来源的情况。.

我们是否注意到urxvtd.service上面的示例中 RXVT_SOCKET 设置的路径不正确.zshenv?重申我的多重事实来源论点。

处理这个问题的最佳方法是什么?

我在想也许我可以这样设置 RXVT_SOCKET urxvtd.socket

[Socket]
Environment=RXVT_SOCKET
ListenStream=%t/urxvt/urxvtd-%H
Run Code Online (Sandbox Code Playgroud)

并且由于urxvtd.service是依赖项,因此应该有一种方法可以导入环境变量。但没有。因此 urxvtd 守护进程的行为就像未设置 RXVT_SOCKET 一样,但由于urxvtd.socket.

然后我挖得更深一些,systemctl --user import-environment RXVT_SOCKET应该跨系统单元导入变量。真的会这样吗?然后我还需要确保导入发生urxvtd.service 运行之前。这将如何运作?

如果我确实将 Xorg/i3 与 systemd 一起使用,我相信应该有一种方法可以跨 systemd 单元传输环境变量。

在这一点上,我可能会相信对于传播环境变量的这种要求没有纯粹的 systemd 解决方案

我最终使用 shell 来包装ExecStart命令,因为 shell 将正确继承环境。