全域會變更所有使用者的路徑,即使在 cron 中也是如此

全域會變更所有使用者的路徑,即使在 cron 中也是如此

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

相關內容