cron でもすべてのユーザーのパスをグローバルに変更する

cron でもすべてのユーザーのパスをグローバルに変更する

CentOS 6 で SGE クラスターをセットアップしています。システム管理者は、RPM 経由でインストールされていない (つまり、make install などの他の手段でインストールされていない) アプリケーションを非標準のディレクトリ (この場合は など) にインストールしています。このパスは現在、によって呼び出される を/share/apps/install/bin/介してほとんどのセッション (login、qlogin など) に追加されています。 また、PERL5LIB にいくつかのものを追加します。 /share/apps/etc/environment.sh/etc/bashrcenvironment.sh

私が遭遇している問題は、/share/apps/install/bincrontab から呼び出されるものなど、一部のインスタンスに が追加されないことです。

個人の 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

拡張子を持つファイルは、.shBash や Zsh などのシェルによってソース化されます。拡張子を持つファイルは、.cshCsh や 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$FOOPATH=/usr/local/bin:/usr/bin:/bin:/share/apps/install/bin

答え3

最終的に私たちが行ったのは、パスの問題を回避するための多面的なソリューションでした。ユースケースに応じて、次の 1 つ以上のソリューションを使用しました。

  • バイナリがパス上にあることを期待するのではなく、非標準の場所にインストールされたバイナリへの絶対パスを使用しました。これは、非標準の外部依存関係がほとんどないかまったくないツールや、独立して動作するツールに使用されました。
  • 必要に応じて環境を設定するツールのラッパー スクリプトを作成して使用し、PATH=... そのスクリプト内で手動で設定したり、source $HOME/.bashrc必要に応じて実行したりしました。これは、他のツールを必要とするツールに使用されましたが、それ以外はクラスターで実行できました。
  • バイナリとより複雑なセットアップを含むコンテナ (この場合は Docker) を作成しました。これは、標準のクラスター セットアップとは大きく異なる環境を必要とするツールに使用されました。

関連情報