web-dev-qa-db-ja.com

Upstart(Ubuntu)で起動したときにアプリが環境変数を取得しない

サーバーを再起動せずに、システム全体で新しい環境変数を取得するにはどうすればよいですか?

Ubuntu 11.xサーバーとして、Upstartを使用してプロセスを開始/再起動しています。

アプリのプロセスの1つで取得する必要がある新しい環境変数を/ etc/environmentに追加しました。

シェルから直接プロセスを開始すると、変数が取得され、すべて問題ありません(セッション用に/ etc/environmentを既に取得しています)。ただし、Upstartサービス名を使用してプロセスを開始/再起動すると、変数が表示されません。

 Sudo start app-name

サーバーを再起動すると、新しい変数が取得されると確信していますが、それは避けたいと思います。他のライブプロセスを実行しているので、可能な限り中断しないようにします。

7
Geuis

この質問には、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からすべてをソースします)。わーい!

3
Jaymon

Envスタンザをupstartジョブ記述ファイルに入れます。

http://upstart.ubuntu.com/wiki/Stanzas#env

env PIDFILE=/var/run/myprocess.pid

または何でも。それはすべてドキュメントにあります。

2
Tom O'Connor

私も同じ問題を抱えていました。私の起動スクリプトはコマンドラインからは正常に機能しましたが、起動スクリプトからは機能しませんでした。

すべての正しい環境変数で機能させるには、upstartスクリプトで. /home/username/.bashrcを取得する必要がありました。

script

  cd /home/me
  . /home/me/.bashrc

  ~/www/app/bin/server.production
end script
1
chovy