為 systemd 單元設置 PATH
如何在 CentOS 7 中為非登錄 shell 設置 PATH?
具體來說,我有一個 systemd 單元,它需要
/usr/local/texlive/2016/bin/x86_64-linux
.我試圖設置它
/etc/environment
,PATH=/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.sh
了export 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= 設置為一個值將附加到之前的設置。