我們正在使用 CentOS 6 設定 SGE 叢集/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),包括二進位檔案和更複雜的設定。這用於需要與我們的標準叢集設定顯著不同的環境的工具。