Centos

為 systemd 單元設置 PATH

  • January 21, 2022

如何在 CentOS 7 中為非登錄 shell 設置 PATH?

具體來說,我有一個 systemd 單元,它需要/usr/local/texlive/2016/bin/x86_64-linux.

我試圖設置它/etc/environmentPATH=/usr/local/texlive/2016/bin/x86_64-linux:$PATH但後來我的 PATH 是/usr/local/texlive/2016/bin/x86_64-linux:$PATH:/usr/local/sbin:/usr/sbin.

我創建/etc/profile.d/texlive.shexport PATH="/usr/local/texlive/2016/bin/x86_64-linux:${PATH}"但僅適用於登錄外殼。

我查看了為所有使用者(登錄和非登錄外殼)設置路徑,但上面已經嘗試了解決方案。

我查看瞭如何在 debian 上為所有使用者的非登錄 shell 和登錄 shell 添加系統 $PATH 的路徑,但沒有可接受的解決方案,我不確定是否要修改/etc/login.defs,因為它可能會在更新中更改。

最簡單的答案是將 設置為systemd 單元文件中命令的PATH一部分。ExecStart例如,如果您目前有

ExecStart=/bin/mycmd arg1 arg2

然後將其更改為

ExecStart=/bin/bash -c 'PATH=/new/path:$PATH exec /bin/mycmd arg1 arg2'

的擴展$PATH將由 bash 完成,而不是 systemd。using 等替代方法Environment=PATH=/new/path:$PATH將不起作用,因為 systemd 不會擴展$PATH.

除非您使用Environment=,EnvironmentFile=PassEnvironment=,否則您應該使用ExecSearchPath=.

man systemd.exec說關於ExecSearchPath=

採用冒號分隔的絕對路徑列表,可以找到 Exec*=(例如 ExecStart=、ExecStop= 等)屬性使用的執行檔。ExecSearchPath= 覆蓋 $ PATH if $ PATH 不是由使用者通過 Environment=、EnvironmentFile= 或 PassEnvironment= 提供的。分配一個空字元串會刪除之前的分配,並且多次將 ExecSearchPath= 設置為一個值將附加到之前的設置。

引用自:https://unix.stackexchange.com/questions/347873