systemd 加载`.profile`后可以启动用户服务吗?

systemd 加载`.profile`后可以启动用户服务吗?

我正在使用 systemd 来启动 Emacs 守护进程,如中所述Emacs 维基

我还使用我的~/.profile文件将用户安装的 TeX Live 安装添加到PATH变量中,因此它包含行

PATH="$HOME/.local/texlive/2023/bin/x86_64-linux:$PATH"

显然,emacs 守护进程是在执行该行之前启动的。[M-x] getenv [RET] PATH显示 texlive 目录不是PATHemacs 所知道的一部分。

注意

systemctl --user show-environment

给出正确的路径,以便执行

systemctl restart --user emacs

解决当前会议的情况。

有没有办法让 systemd.profile在启动用户服务之前等待文件执行?

答案1

设置用户服务环境的标准方法在人类环境.d。通常,您会创建一个文件 ~/.config/environment.d/90texlive.conf,例如包含以下行

PATH="$HOME/.local/texlive/2023/bin/x86_64-linux:$PATH"

该文件由 systemd 解析,因此请注意语法有限,但通常可以使其与 shell 兼容,因此如果您不想在那里重复该行,则可以source从您的文件中获取它。测试时.profile记得做一个。systemctl --user daemon-reload

请注意,systemd 将 PATH 初始化为可能不像您的 shell 通常获取的那么广泛,因此您可能还需要其他配置行或文件。

您的 PATH 最终如何.profile进入 systemd 的环境?桌面启动的某些部分可能会执行类似的操作

systemctl --user import-environment

或者

dbus-update-activation-environment --systemd --all 

答案2

等待.profile执行对解决您的问题没有帮助,因为用户服务不是执行的 shell 的子进程~/.profile,所以无法从中继承任何环境变量设置

如果您想$PATH为您的进行自定义emacs.service,则必须在服务文件(或覆盖文件)中进行操作,可能需要使用部分Environment=中的选项[Service]。请注意,该选项不会执行环境变量扩展Environment=,因此您将无法使用$HOMEor $PATH,但您可以使用%h来引用用户的主目录。

因此,Environment=您需要的行可能是这样的:

Environment="PATH=%h/.local/texlive/2023/bin/x86_64-linux:%h/bin:/usr/local/bin:/usr/bin:/bin"

相关内容