设置 systemd 单元的 PATH

设置 systemd 单元的 PATH

如何在 CentOS 7 中设置非登录 shell 的 PATH?

具体来说,我有一个 systemd 单元,需要/usr/local/texlive/2016/bin/x86_64-linux.

我尝试将其设置/etc/environment为 withPATH=/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}",但这只适用于登录 shell。

我在看为所有用户设置路径(登录和非登录外壳)但上面已经尝试过该解决方案。

我在看如何在 debian 上为所有用户的非登录 shell 和登录 shell 添加系统 $PATH 路径但没有公认的解决方案,我不确定是否要修改,/etc/login.defs因为它可能会在更新中发生变化。

答案1

最简单的答案是将其设置为 systemd 单元文件中命令PATH的一部分。ExecStart例如,如果您当前有

ExecStart=/bin/mycmd arg1 arg2

然后将其更改为

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

的扩展$PATH将由 bash 完成,而不是 systemd。使用等替代方案Environment=PATH=/new/path:$PATH将不起作用,因为 systemd 不会扩展$PATH.

答案2

除非您使用Environment=,EnvironmentFile=PassEnvironment=, 否则您应该使用ExecSearchPath=.

man systemd.exec说关于ExecSearchPath=

采用冒号分隔的绝对路径列表,相对于 Exec*=(例如 ExecStart=、ExecStop= 等)属性使用的可执行文件可以找到。如果用户未通过 Environment=、EnvironmentFile= 或 PassEnvironment= 提供 $PATH,ExecSearchPath= 将覆盖 $PATH。分配空字符串会删除以前的分配,并且多次将 ExecSearchPath= 设置为某个值将附加到以前的设置。

答案3

我已经成功使用 env 程序(systemd 不允许通过配置文件更改它):

ExecStart=/usr/bin/env PATH=/usr/bin:/path1:/path2 mycmd arg1 arg2

请注意,env 不会启动一个新的 shell 来执行程序,这可能是也可能不是您想要的。

相关内容