全局更改所有用户的路径,即使在 cron 中也是如此

全局更改所有用户的路径,即使在 cron 中也是如此

我们正在使用 CentOS 6 设置 SGE 集群。我的系统管理员正在安装不是通过 RPM(即通过 make install 等其他方式)安装的应用程序,这些应用程序应该位于非标准目录中,在本例中类似于/share/apps/install/bin/.目前,此路径已添加到大多数会话(登录、qlogin 等),通过/share/apps/etc/environment.sh该路径由/etc/bashrc. environment.sh还向 PERL5LIB 附加了一些内容。

我遇到的问题是,它/share/apps/install/bin没有添加到某些实例中,例如从 crontab 调用的东西。

我知道我可以在我的个人 crontab 或任何给定的脚本或 crontab 条目中手动和显式设置PATH=/bin:/usr/bin:/blah/blah:...,但我希望在外部某个地方有一个设置,/etc/profile或者/etc/bashrc将非标准.../bin目录放入所有用户的所有路径中。

答案1

PATH添加一个文件,其中包含您希望在 中包含的值/etc/profile.d。这些文件设置为由 Bash、Csh、Zsh 或 tcsh 等 shell 获取。

例子

我们需要将以下值添加到我们的 PATH 中。

/usr/local/share/bin

所以我们创建了一个文件,/etc/profile.d/ourstuff.sh其中包含以下行:

export PATH=/usr/local/share/bin:$PATH

具有扩展名的文件.sh由 Bash 和 Zsh 等 shell 获取。具有扩展名的文件.csh来自 Csh 和 tcsh。

编辑 #1 - 后续行动

OP 提出了以下后续问题。

是的,但是 cron 作业呢?有没有办法即使在那里也能找到路径? cron 似乎没有调用 /etc/profile 或 /etc/bashrc。

我对此的回应是:

纠正它不会也不会。您需要设置SHELL=/bin/bashcron 来覆盖默认 shell(通常是/bin/sh)。您还可以为用户 crons 设置此项,BASH_ENV="$HOME/.bashrc",为系统 crons 设置此项BASH_ENV="/root/.bashrc"。这是解决这个问题的一种方法。

我强烈建议你不要这样做。让需要特定环境的脚本自行设置。不要试图在全球范围内解决所有问题!

答案2

您可以将环境变量定义放入/etc/environment(假设您的系统加载pam_env对于所有服务,这应该是所有现代非嵌入式 Linux 系统上的默认设置)。

请注意,您只能放置静态环境变量定义,其形式为VARIABLE=VALUEVARIABLE="VALUE",每行一个定义。你不能有任意的 shell 命令,你不能通过写入FOO=hello+$BAR(将文字放入$的值中)来引用另一个变量的值FOO,等等。只要你坚持简单的赋值,比如PATH=/usr/local/bin:/usr/bin:/bin:/share/apps/install/bin,你就可以了(请注意,您不能在那里使用用户的主目录:所有用户的值必须相同)。

答案3

我们最终采取的是多管齐下的解决方案,以避免任何路径问题。根据用例,我们使用了以下一项或多项:

  • 使用安装在非标准位置的二进制文件的绝对路径,而不是期望二进制文件位于路径上。这用于具有很少(如果有的话)非标准外部依赖项和/或独立工作的工具。
  • 为根据需要设置环境的工具创建并使用包装脚本;PATH=... 在该脚本中手动设置和/或source $HOME/.bashrc根据需要运行。这用于需要其他工具但能够在我们的集群上运行的工具。
  • 创建了一个容器(在我们的例子中是 Docker),包括二进制文件和更复杂的设置。这用于需要与我们的标准集群设置显着不同的环境的工具。

相关内容