Назад | Перейти на главную страницу

Переменная среды не обрабатывается приложением при запуске с Upstart (Ubuntu)

Как можно получить новую переменную среды в масштабе всей системы без перезапуска сервера?

Поскольку это сервер Ubuntu 11.x, я использую Upstart для запуска / перезапуска процессов.

Я добавил новую переменную среды в / etc / environment, которая должна быть получена одним из процессов моего приложения.

Если я запускаю процесс прямо из своей оболочки, переменная подбирается, и все в порядке (я уже получил / etc / environment для своего сеанса). Однако, когда я запускаю / перезапускаю процесс, используя имя службы Upstart, переменная не отображается.

 sudo start app-name

Я почти уверен, что если я перезапущу сервер, новая переменная будет подхвачена, однако я бы попытался избежать этого. На нем запущены другие живые процессы, которые я бы не хотел прерывать, если это вообще возможно.

Этот вопрос, кажется, содержит много подвопросов о том, как обрабатывать переменные среды в сценарии Upstart, поэтому я подумал, что поделюсь несколькими вещами, которые я делаю, чтобы обрабатывать и тестировать свою среду для Upstart и Cron.

Первое, что нужно знать о Upstart и т.п., это то, что он не использует ту же среду, что и ваш активный терминал, поэтому что-то вроде:

$ export FOO=bar
$ start upstart-name

не работает потому что upstart-name на самом деле не увидит FOO вы только что экспортировали в текущую оболочку, потому что Upstart работает в чистой среде.

Вы можете имитировать чистую среду, в которой работает 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, который является источником нашего общего файла (по умолчанию ssh в Ubuntu будет исходить все из /etc/profile.d). Ура!

Поместите env stanza в файл описания вакансии выскочки.

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

env PIDFILE=/var/run/myprocess.pid

Или как там. Это все в документации.

У меня такая же проблема. Мой сценарий запуска отлично работал из командной строки, но не из сценария выскочки.

Мне просто нужно было найти свой . /home/username/.bashrc в моем сценарии выскочки, чтобы заставить его работать со всеми правильными переменными среды.

script

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

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