web-dev-qa-db-ja.com

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

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。

5
Aphoid

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

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

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)を上書きするには、cronで/bin/shを設定する必要があります。また、これをユーザーcronのBASH_ENV = "$ HOME/.bashrc"に、システムcronのBASH_ENV="/root/.bashrc"に設定できます。これを回避する方法の1つになります。

これを行わないことを強くお勧めします。特定の環境を必要とするスクリプトに自分で設定させます。すべての問題をグローバルレベルで解決しようとしないでください。

11
slm

環境変数の定義を/etc/environmentに配置できます(システムがすべてのサービスに対して pam_env をロードすると想定します。これは、すべての最新の非組み込みLinuxシステムのデフォルトである必要があります)。

静的環境変数の定義は、VARIABLE=VALUEまたはVARIABLE="VALUE"の形式で、1行に1つしか定義できないことに注意してください。任意のシェルコマンドを使用することはできません。FOO=hello+$BARFOOの値にリテラル$を入れる)を書き込んで、別の変数の値を参照することはできません。 。PATH=/usr/local/bin:/usr/bin:/bin:/share/apps/install/binのような単純な割り当てに固執する限り、問題はありません(ユーザーのホームディレクトリをそこで使用することはできません。値はすべてのユーザーで同じである必要があります)。