サーバーを再起動せずに、システム全体で新しい環境変数を取得するにはどうすればよいですか?
Ubuntu 11.xサーバーとして、Upstartを使用してプロセスを開始/再起動しています。
アプリのプロセスの1つで取得する必要がある新しい環境変数を/ etc/environmentに追加しました。
シェルから直接プロセスを開始すると、変数が取得され、すべて問題ありません(セッション用に/ etc/environmentを既に取得しています)。ただし、Upstartサービス名を使用してプロセスを開始/再起動すると、変数が表示されません。
Sudo start app-name
サーバーを再起動すると、新しい変数が取得されると確信していますが、それは避けたいと思います。他のライブプロセスを実行しているので、可能な限り中断しないようにします。
この質問には、Upstartスクリプトで環境変数を処理する方法に関する多くのサブ質問が含まれているようです。そのため、UpstartとCronの環境を処理およびテストするために行ういくつかのことを共有したいと思いました。
Upstartなどについて最初に知っておくべきことは、アクティブな端末と同じ環境を共有していないため、次のようになります。
$ export FOO=bar
$ start upstart-name
upstartはクリーンな環境で実行されるため、upstart-name
は現在のシェルにエクスポートしたばかりのFOO
を実際には認識しないため機能しません。
Upstart(およびCron)が実行されるクリーンな環境を、何ヶ月も前に別の回答から取得したこの便利な方法で模倣できます。
# makes the current Shell have an environment like cron or upstart
# http://stackoverflow.com/a/2546509/5006
function cronenv() {
cron_env+="HOME=$HOME\n"
cron_env+="LOGNAME=$LOGNAME\n"
cron_env+="PATH=/usr/bin:/bin\n"
cron_env+="Shell=/bin/sh\n"
cron_env+="PWD=$PWD\n"
if [[ -n $LC_ALL ]]; then
cron_env+="LC_ALL=$LC_ALL\n"
fi
env - `echo -e $cron_env` /bin/sh
}
それを.bash_profile
などにダンプするだけで、Upstartが実行するようにコマンドを実行できます。
$ cronenv
$ some/big/command --to --run --as --upstart
それでは、実際にボックスに共有環境を設定しましょう。環境変数を/etc/profile.d/environ.sh
に配置して設定します。
# /etc/profile.d/environ.sh
export FOO=bar
次に、Upstartスクリプトでそれを調達します。
script
# source our common environment file
. /etc/profile.d/environ.sh
exec some/big/command --to --run --as --upstart
end script
これで、共通ファイルをソースするシェルとUpstartスクリプトで環境を「見る」ことができるようになります(デフォルトでは、Ubuntuのsshは/etc/profile.d
からすべてをソースします)。わーい!
Envスタンザをupstartジョブ記述ファイルに入れます。
http://upstart.ubuntu.com/wiki/Stanzas#env
env PIDFILE=/var/run/myprocess.pid
または何でも。それはすべてドキュメントにあります。
私も同じ問題を抱えていました。私の起動スクリプトはコマンドラインからは正常に機能しましたが、起動スクリプトからは機能しませんでした。
すべての正しい環境変数で機能させるには、upstartスクリプトで. /home/username/.bashrc
を取得する必要がありました。
script
cd /home/me
. /home/me/.bashrc
~/www/app/bin/server.production
end script