我们正在使用 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/bash
cron 来覆盖默认 shell(通常是/bin/sh
)。您还可以为用户 crons 设置此项,BASH_ENV="$HOME/.bashrc",为系统 crons 设置此项BASH_ENV="/root/.bashrc"
。这是解决这个问题的一种方法。
我强烈建议你不要这样做。让需要特定环境的脚本自行设置。不要试图在全球范围内解决所有问题!
答案2
您可以将环境变量定义放入/etc/environment
(假设您的系统加载pam_env
对于所有服务,这应该是所有现代非嵌入式 Linux 系统上的默认设置)。
请注意,您只能放置静态环境变量定义,其形式为VARIABLE=VALUE
或VARIABLE="VALUE"
,每行一个定义。你不能有任意的 shell 命令,你不能通过写入FOO=hello+$BAR
(将文字放入$
的值中)来引用另一个变量的值FOO
,等等。只要你坚持简单的赋值,比如PATH=/usr/local/bin:/usr/bin:/bin:/share/apps/install/bin
,你就可以了(请注意,您不能在那里使用用户的主目录:所有用户的值必须相同)。
答案3
我们最终采取的是多管齐下的解决方案,以避免任何路径问题。根据用例,我们使用了以下一项或多项:
- 使用安装在非标准位置的二进制文件的绝对路径,而不是期望二进制文件位于路径上。这用于具有很少(如果有的话)非标准外部依赖项和/或独立工作的工具。
- 为根据需要设置环境的工具创建并使用包装脚本;
PATH=...
在该脚本中手动设置和/或source $HOME/.bashrc
根据需要运行。这用于需要其他工具但能够在我们的集群上运行的工具。 - 创建了一个容器(在我们的例子中是 Docker),包括二进制文件和更复杂的设置。这用于需要与我们的标准集群设置显着不同的环境的工具。