CentOS 6でSGEクラスターをセットアップしています。私のsysadminは、RPMを介して(つまり、make installなどの他の手段を介して)インストールされていないアプリケーションをインストールしています。この場合、/share/apps/install/bin/
のような非標準のディレクトリに移動する必要があります。このパスは現在、/share/apps/etc/environment.sh
によって呼び出される/etc/bashrc
を介してほとんどのセッション(ログイン、qloginなど)に追加されています。 environment.sh
はまた、Perl5LIBにいくつかのものを追加します。
私が実行している問題は、/share/apps/install/bin
が一部のインスタンスに追加されていないことです。 crontabから呼び出されたもの。
私は手動で明示的にPATH=/bin:/usr/bin:/blah/blah:...
を個人のcrontab内または特定のスクリプトまたはcrontabエントリ内に設定できることを知っていますが、私が期待しているのは、/etc/profile
または/etc/bashrc
以外のどこかに非標準の.../bin
ディレクトリを設定することです。すべてのユーザーのPATH。
最終的に行ったのは、パスの問題を回避するための多面的なソリューションでした。ユースケースに応じて、以下の1つ以上を使用しました。
PATH=...
を手動で設定するか、必要に応じてsource $HOME/.bashrc
を実行します。これは、他のツールを必要とするツールに使用されましたが、それ以外の場合はクラスターで実行できました。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がソースです。
OPは次のフォローアップ質問をしました。
はい、でもcronジョブはどうですか?そこにパスを取得する方法はありますか? cronは/ etc/profileまたは/ etc/bashrcを呼び出していないようです。
私はそれに答えました:
修正しませんし、修正しません。デフォルトのシェル(通常はShell=/bin/bash
)を上書きするには、cronで/bin/sh
を設定する必要があります。また、これをユーザーcronのBASH_ENV = "$ HOME/.bashrc"に、システムcronのBASH_ENV="/root/.bashrc"
に設定できます。これを回避する方法の1つになります。
これを行わないことを強くお勧めします。特定の環境を必要とするスクリプトに自分で設定させます。すべての問題をグローバルレベルで解決しようとしないでください。
環境変数の定義を/etc/environment
に配置できます(システムがすべてのサービスに対して pam_env
をロードすると想定します。これは、すべての最新の非組み込みLinuxシステムのデフォルトである必要があります)。
静的環境変数の定義は、VARIABLE=VALUE
またはVARIABLE="VALUE"
の形式で、1行に1つしか定義できないことに注意してください。任意のシェルコマンドを使用することはできません。FOO=hello+$BAR
(FOO
の値にリテラル$
を入れる)を書き込んで、別の変数の値を参照することはできません。 。PATH=/usr/local/bin:/usr/bin:/bin:/share/apps/install/bin
のような単純な割り当てに固執する限り、問題はありません(ユーザーのホームディレクトリをそこで使用することはできません。値はすべてのユーザーで同じである必要があります)。