在 systemd 中传递环境变量

在 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

现在urxvtd.socket依赖Requires于 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

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

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

export RXVT_SOCKET=${XDG_RUNTIME_DIR}/urxvt/urxvtd-machinename

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

但是,urxvtd.service由于启动urxvtd(守护进程),因此它还需要 RXVT_SOCKET。

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

...
Environment=RXVT_SOCKET=%t/urxvtd-%H
...

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

注意,i3 需要再次设置.zshenv才能获取它。这是一个简单环境变量有多个事实来源的情况。

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

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

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

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

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

然后我更深入地挖掘,systemctl --user import-environment RXVT_SOCKET应该跨 systemd 单元导入变量。真的会这样吗?然后我还需要确保导入发生urxvtd.service 运行。那会如何运作呢?

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

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

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

相关内容