Как можно получить новую переменную среды в масштабе всей системы без перезапуска сервера?
Поскольку это сервер 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