サーバーでUbuntu9.1(Karmic Koala)を使用しています。
すべてのプロセスでグローバルに利用できるように環境変数を設定するという単純な問題は、私を夢中にさせています。助けていただければ幸いです。
.bashrc、.bashrc、.profileなど、いくつかの異なる「通常の疑わしい」場所でexportコマンドを使用して設定してみました。これらはシェル自体とシェルから分岐したプロセスには最適ですが、シェルの外部で開始されたプロセスには機能しません(たとえば、起動時にデーモンが起動したり、Capistranoによって起動されたMongrelにこれらの変数が設定されていないように見えるのは特に厄介です)したがって、Rubyはそれらにアクセスできません)。
また、シェルスクリプトでそれらを設定し、起動時に(update-rc.dメソッドを介して)このスクリプトを呼び出すなど、いくつかのクレイジーなアイデアを試しましたが、役に立ちませんでした。
Windowsでは、OSのすべてのプロセスで使用できるようになる「システム変数」を簡単に定義できます。 Linuxでこれを行うにはどうすればよいですか。特にDebianベースのOS?
プロセス(シェルを含む)は、親から変数を継承するだけです。その後、外部から変更する方法はありません。
ブート(システムプロセスの場合)またはシェル呼び出し(ユーザープロセスの場合)のできるだけ早い段階で「グローバル変数」を設定するか、複数の場所に設定するように辞任します。
これは苦痛に思えるかもしれませんが、別のプロセス環境を変更する機能はバグであり、あらゆる種類の厄介な競合状態を引き起こします。
「グローバル」環境変数が必要な場合、何をしようとしていますか?問題を回避する方法があるかもしれません。
回避策::onlyが必要な変数を設定し、それをグローバルに配置する、お気に入りのシェル形式で最小限のスクリプトを記述しますアクセス可能な場所:
/etc/loglocaltion.sh
:
export MY_LOG_DIR=/opt/share/mylog
export MY_DEFAULT_LOG_LEVEL=URGENT
その構成を使用するすべての場合は、次のいずれかを実行します。
source
edloglocation.shがあるシェルから起動します。シェル、つまり.bash_profile
)。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によって開始されたプロセスではありませんが、それは私の問題であり、あなたの問題ではありません:-)
この記事は私を助けました: https://help.ubuntu.com/community/EnvironmentVariables
基本的に、/etc/environment
はシステム全体の変数に適しており、/etc/profile.d/
の下の.shファイルは、誰かがコンソールまたはssh経由でログインするたびに実行されます。