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

Aph*_*oid 5 cron settings centos path

我们正在使用 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 中调用的东西。

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

slm*_*slm 11

添加一个文件,该文件具有您希望PATH/etc/profile.d. 这些文件设置为由 Bash、Csh Zsh 或 tcsh 等 shell 提供源。

例子

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

/usr/local/share/bin
Run Code Online (Sandbox Code Playgroud)

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

export PATH=/usr/local/share/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

带有扩展名的文件.sh来自诸如 Bash 和 Zsh 之类的 shell。带有扩展名的文件.csh来自 Csh 和 tcsh。

编辑 #1 - 跟进

OP 询问了以下后续问题。

是的,但是 cron 工作呢?有没有办法让路径甚至在那里?cron 似乎没有调用 /etc/profile 或 /etc/bashrc。

我对此作出回应:

纠正它不会也不会。您需要设置SHELL=/bin/bashin cron 以覆盖默认 shell(通常为/bin/sh)。您还可以设置该用户crons,BASH_ENV =“$ HOME / .bashrc中”,这对于系统crons, BASH_ENV="/root/.bashrc"。将是解决这个问题的一种方式。

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


Aph*_*oid 0

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

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