Вопрос: Переменная окружения, которая не используется при запуске с помощью Upstart (Ubuntu)


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

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

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

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

 sudo start app-name

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


7
2017-12-17 10:59


Источник




Ответы:


Этот вопрос, похоже, содержит много вопросов о том, как обрабатывать переменные среды в сценарии 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). Ура!


3
2018-05-29 23:36





Поместите строфу env в файл описания задания вверх.

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

env PIDFILE=/var/run/myprocess.pid

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


2
2017-12-17 11:02



Спасибо, я могу полностью сделать эту работу. Я бы хотел пойти дальше и сделать его глобальным и постоянным. Я устанавливаю переменную, которую могут использовать несколько процессов, чтобы определить, находятся ли они в среде разработки или производства. Файл conf будет работать до сих пор, потому что я развивается на Mac, но в конечном итоге у меня будет интегрированная среда Ubuntu, и каждый сервер будет запускать несколько отдельных процессов приложений. Им было бы удобно не полагаться на confs. - Geuis
Какие? Вы хотите использовать Upstart. Хорошо. Вам нужно указать вещи в конфигурации Upstart, чтобы он знал, как запускать процессы. Это либо это, либо вы создаете сценарий оболочки, который устанавливает и экспортирует переменные среды (беспорядочно) или изменяет профиль bash по умолчанию, поэтому они всегда устанавливаются и экспортируются (Insanely Messy). - Tom O'Connor
правильно способ сделать это - использовать что-то вроде Puppet для управления различными средами, а затем Puppet может управлять различными конфигурационными файлами на многих серверах без суеты. - Tom O'Connor
Том, у меня запуталась странная проблема. Используя env, я не могу установить какие-либо пользовательские переменные среды. Если я устанавливаю системные определенные вары, они читаются приложением. Но мои собственные нет. Например, я устанавливаю без кавычек в conf, «env DISPLAY = foo», а DISPLAY выбирается со значением foo. Но если я установил «env TESTENV = foo», переменная TESTENV даже не обнаружена. - Geuis
Я посоветую rc.local попробовать немного поспать. Спасибо за советы setgid. Я также сомневался в sudo, но это то, что большинство примеров, которые я видел, это работает. Для моих существующих приложений он работает довольно надежно какое-то время, но я собираюсь заглянуть в вашу ссылку и посмотреть, как это можно сделать более надежно. Поистине оцените вашу помощь сегодня вечером, и, надеюсь, я смогу выяснить остальное. - Geuis


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

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

script

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

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

1
2017-11-02 07:28



Это не работает для меня (Ubuntu Server 14.04.1). Я не получаю ошибки при поиске /home/<user>/.bashrc внутри сценария Upstart, но env vars не прилипают к следующей команде (при запуске приложения / службы). - odigity