4

Я использую Ubuntu 9.1 (Karmic Koala) на моем сервере.

Простой вопрос настройки переменных среды, чтобы они были доступны всем процессам, сводит меня с ума, и я был бы признателен за некоторую помощь!

Я попытался установить их с помощью команды экспорта в нескольких разных «обычных подозрительных» местах, таких как .bashrc, .bashrc, .profile. Они отлично работают для самой оболочки, а процессы разветвляются за пределы оболочки, но не для процессов, запускаемых вне оболочки (например, демоны, запускаемые во время загрузки или особенно раздражающие для меня, заключаются в том, что Mongrel, запущенный Capistrano, похоже, не имеет установленных переменных и, следовательно, Ruby не имеет к ним доступа).

Я также попробовал некоторые безумные идеи, такие как установка их в сценарии оболочки и вызов этого сценария во время загрузки (через метод update-rc.d) безрезультатно.

В Windows можно просто определить "системную переменную", которая становится доступной для всех процессов в ОС. Как это сделать в Linux; конкретно ОС на базе Debian?

3 ответа3

7

Процессы (включая оболочки) наследуют только переменные от своих родителей. После этого невозможно изменить их снаружи.

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

Это может показаться болезненным, но возможность изменить другую среду процессов была бы ошибкой и привела бы ко всем видам неприятных условий гонки.


Что вы пытаетесь сделать, что вы хотите "глобальные" переменные среды? Там может быть способ обойти вашу проблему.

Обходной путь :: Напишите минимальный сценарий в вашем любимом формате оболочки, который устанавливает только переменную, которую вы хотите, и поместите ее в глобально доступное место:

/etc/loglocaltion.sh:

export MY_LOG_DIR=/opt/share/mylog
export MY_DEFAULT_LOG_LEVEL=URGENT

и для всего, что вы хотите использовать эту конфигурацию, выполните одно из

  1. запустить его из оболочки, в которой есть source файл ed loglocation.sh в неинтерактивном файле входа в систему (тот, который читается для всех экземпляров оболочки, т.е. .bash_profile).
  2. напишите минимальный скрипт-обертку, который loglocation.sh перед запуском настоящей программы. launchcorelogger.sh:

 

 CORELOGGER=/opt/sbin/mycorelogger
 source /etc/loglocation.sh
 exec $CORELOGGER

и init запустил скрипт.

Теперь изменения в сценарии loglocation повлияют на всю связанную обработку, если вы запустите их из свежей оболочки в первом случае или перезапустите их, перезапустив систему dameon (/etc/init.d/mycorelogger restart или любой другой).

2

Я предлагаю поместить ваши env vars в /etc /environment. Шахта в настоящее время содержит

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
NUKE_PATH=/spr/studio/codebase/nuke

и NUKE_PATH устанавливается для процессов cron и оболочек Bash.

(К сожалению, не для процессов, запущенных Deadline, приложением очереди процессов, но это моя проблема, а не ваша :-)

1

Эта статья помогла мне: https://help.ubuntu.com/community/EnvironmentVariables

По сути, /etc/environment подходит для общесистемных переменных, а файлы .sh в /etc/profile.d/ будут запускаться всякий раз, когда кто-то входит в систему через консоль или через ssh.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .