CentOS 6 で SGE クラスターをセットアップしています。システム管理者は、RPM 経由でインストールされていない (つまり、make install などの他の手段でインストールされていない) アプリケーションを非標準のディレクトリ (この場合は など) にインストールしています。このパスは現在、によって呼び出される を/share/apps/install/bin/
介してほとんどのセッション (login、qlogin など) に追加されています。 また、PERL5LIB にいくつかのものを追加します。 /share/apps/etc/environment.sh
/etc/bashrc
environment.sh
私が遭遇している問題は、/share/apps/install/bin
crontab から呼び出されるものなど、一部のインスタンスに が追加されないことです。
個人の crontab 内、または任意のスクリプトや crontab エントリ内で手動で明示的に設定できることはわかっていますが、外部のどこかに設定があるか、非標準ディレクトリをすべてのユーザーのすべての PATH に配置するPATH=/bin:/usr/bin:/blah/blah:...
設定があることを期待しています。 /etc/profile
/etc/bashrc
.../bin
答え1
PATH
に設定したい値を含むファイルを追加します/etc/profile.d
。これらのファイルは、Bash、Csh、Zsh、tcsh などのシェルによって取得されるように設定されます。
例
PATH に次の値を追加する必要がありました。
/usr/local/share/bin
/etc/profile.d/ourstuff.sh
そこで、次の行を含むファイル を作成しました。
export PATH=/usr/local/share/bin:$PATH
拡張子を持つファイルは、.sh
Bash や Zsh などのシェルによってソース化されます。拡張子を持つファイルは、.csh
Csh や tcsh によってソース化されます。
編集#1 - フォローアップ
OP は次の追加の質問をしました。
はい、しかし cron ジョブはどうでしょうか? そこにもパスを取得する方法はありますか? cron は /etc/profile または /etc/bashrc を呼び出さないようです。
私はこう答えました。
修正してください。修正されませんし、修正されることはありません。SHELL=/bin/bash
デフォルトのシェル (通常は/bin/sh
) を上書きするには、cron で を設定する必要があります。また、ユーザー cron の場合は BASH_ENV="$HOME/.bashrc"、システム cron の場合は を設定することもできます。BASH_ENV="/root/.bashrc"
これは、この問題を回避する 1 つの方法です。
これを行わないことを強くお勧めします。特定の環境を必要とするスクリプトに、その環境を自分で設定させてください。すべての問題をグローバル レベルで解決しようとしないでください。
答え2
環境変数の定義を/etc/environment
(システムがロードすることを前提として)pam_env
すべてのサービスに対して有効であり、これはすべての最新の非組み込み Linux システムでデフォルトになるはずです。
1 行に 1 つの定義を含む、VARIABLE=VALUE
または の形式の静的な環境変数定義のみを記述できることに注意してください。任意のシェル コマンドを使用することはできません。また、 (の値にリテラルを配置する) などと記述して別の変数の値を参照することもできません。 のような単純な割り当てに固執している限り、問題ありません (ユーザーのホーム ディレクトリをそこで使用できないことに注意してください。値はすべてのユーザーで同じである必要があります)。VARIABLE="VALUE"
FOO=hello+$BAR
$
FOO
PATH=/usr/local/bin:/usr/bin:/bin:/share/apps/install/bin
答え3
最終的に私たちが行ったのは、パスの問題を回避するための多面的なソリューションでした。ユースケースに応じて、次の 1 つ以上のソリューションを使用しました。
- バイナリがパス上にあることを期待するのではなく、非標準の場所にインストールされたバイナリへの絶対パスを使用しました。これは、非標準の外部依存関係がほとんどないかまったくないツールや、独立して動作するツールに使用されました。
- 必要に応じて環境を設定するツールのラッパー スクリプトを作成して使用し、
PATH=...
そのスクリプト内で手動で設定したり、source $HOME/.bashrc
必要に応じて実行したりしました。これは、他のツールを必要とするツールに使用されましたが、それ以外はクラスターで実行できました。 - バイナリとより複雑なセットアップを含むコンテナ (この場合は Docker) を作成しました。これは、標準のクラスター セットアップとは大きく異なる環境を必要とするツールに使用されました。