web-dev-qa-db-ja.com

Linuxですべてのプロセスの環境変数を設定する

サーバーでUbuntu9.1(Karmic Koala)を使用しています。

すべてのプロセスでグローバルに利用できるように環境変数を設定するという単純な問題は、私を夢中にさせています。助けていただければ幸いです。

.bashrc、.bashrc、.profileなど、いくつかの異なる「通常の疑わしい」場所でexportコマンドを使用して設定してみました。これらはシェル自体とシェルから分岐したプロセスには最適ですが、シェルの外部で開始されたプロセスには機能しません(たとえば、起動時にデーモンが起動したり、Capistranoによって起動されたMongrelにこれらの変数が設定されていないように見えるのは特に厄介です)したがって、Rubyはそれらにアクセスできません)。

また、シェルスクリプトでそれらを設定し、起動時に(update-rc.dメソッドを介して)このスクリプトを呼び出すなど、いくつかのクレイジーなアイデアを試しましたが、役に立ちませんでした。

Windowsでは、OSのすべてのプロセスで使用できるようになる「システム変数」を簡単に定義できます。 Linuxでこれを行うにはどうすればよいですか。特にDebianベースのOS?

4
bhavinb

プロセス(シェルを含む)は、親から変数を継承するだけです。その後、外部から変更する方法はありません。

ブート(システムプロセスの場合)またはシェル呼び出し(ユーザープロセスの場合)のできるだけ早い段階で「グローバル変数」を設定するか、複数の場所に設定するように辞任します。

これは苦痛に思えるかもしれませんが、別のプロセス環境を変更する機能はバグであり、あらゆる種類の厄介な競合状態を引き起こします。


「グローバル」環境変数が必要な場合、何をしようとしていますか?問題を回避する方法があるかもしれません。

回避策::onlyが必要な変数を設定し、それをグローバルに配置する、お気に入りのシェル形式で最小限のスクリプトを記述しますアクセス可能な場所:

/etc/loglocaltion.sh

export MY_LOG_DIR=/opt/share/mylog
export MY_DEFAULT_LOG_LEVEL=URGENT

その構成を使用するすべての場合は、次のいずれかを実行します。

  1. 非対話型ログインファイル(allのインスタンスに対して読み取られるもの)にsourceedloglocation.shがあるシェルから起動します。シェル、つまり.bash_profile)。
  2. 実際のプログラムを起動する前に、loglocation.shをソースとする最小限のラッパースクリプトを記述します。 launchcorelogger.sh

 CORELOGGER=/opt/sbin/mycorelogger
 source /etc/loglocation.sh
 exec $CORELOGGER

initにスクリプトを実行させます。

ログロケーションスクリプトの編集は、最初のケースで新しいシェルから実行した場合、またはシステムを使用して再起動した場合、関連するすべての処理に影響します。dameonrestarted(/etc/init.d/mycorelogger restartなど)。

私はあなたの環境変数を/ etc/environmentに置くことを提案します。鉱山は現在含まれています

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
NUKE_PATH=/spr/studio/codebase/nuke

nUKE_PATHは、cronプロセスとBashシェルに設定されています。

(残念ながら、プロセスキューイングアプリであるDeadlineによって開始されたプロセスではありませんが、それは私の問題であり、あなたの問題ではありません:-)

2
smolin

この記事は私を助けました: https://help.ubuntu.com/community/EnvironmentVariables

基本的に、/etc/environmentはシステム全体の変数に適しており、/etc/profile.d/の下の.shファイルは、誰かがコンソールまたはssh経由でログインするたびに実行されます。

1
lane