Как указать переменную среды root?

Я занимаюсь разработкой рельсов. В этом приложении мне нужно указать переменную среды LD_LIBRARY_PATH = /usr/local/oracle/lib, но когда я запускаю приложение с помощью скрипта / сервера sudo, оно не запускается, потому что этот путь к библиотеке не находится в env root.

Что я должен сделать, чтобы это работало? Я пытался поставить путь под root ./bashrc и это не сработало.

8 ответов

У меня была похожая проблема. Я посмотрел в моем /etc/sudoers файл, и я увидел эти строки:

Значения по умолчанию env_reset
Defaults    env_keep = "ЦВЕТА ВЫЗОВ HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY lc_name LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL ЯЗЫК LINGUAS \
                        _XKB_CHARSET XAUTHORITY"

Чтобы моя переменная окружения была там, я должен был добавить ее имя после "XAUTHORITY". В вашем случае вы бы:

По умолчанию env_keep = "ЦВЕТА ОТОБРАЖЕНИЕ HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY LD_LIBRARY_PATH"

Дайте это попробовать.

Также убедитесь, что вы установили BASH_ENV="~/.bashrc" в /etc/environment,

Смотрите этот другой ответ для более подробной информации

Способ, которым вы достигли своего пользователя root, имеет здесь значение. Различные методы входа в систему создают разные среды.

Например:

  • Если bash - ваша корневая оболочка, она будет читать .bashrc при запуске
  • Если bash - ваша корневая оболочка, и это оболочка "login", она будет читать .bash_profile при запуске
  • Если вы входите через ssh, он будет использовать .ssh/environment также
  • Если вы входите через логин, то есть из консоли, /etc/pam.d/login будет использовать pam_env.so для чтения /etc/security/pam_env.conf (в зависимости от дистрибутива) и /etc/environment (если есть readenv=1) в командной строке
  • и т.п.

Итак, если вы не получаете нужную среду - вам нужно выяснить цепочку логинов, которая ведет вас к программному обеспечению, которое вы запускаете. Это может быть что-то вроде: gdm (X) login -> эмулятор терминала -> bash shell -> su -> bash shell (root) -> software.

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

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

Вы пробовали это:

sudo su - root -c "LD_LIBRARY_PATH=/usr/local/oracle/lib <command to start the app>"

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

Вы можете попробовать установить переменную окружения из процесса rails, попробуйте добавить что-то вроде ниже в $RAILS_ROOT/config/environment.rb

Rails::Initializer.run do |config|
   ENV['LD_LIBRARY_PATH'] = "/usr/local/oracle_client/v8_1_7/lib"
end

вам, вероятно, нужно убедиться, что это установлено, прежде чем добавлять операторы require или gem для привязок базы данных oracle.

Если это дистрибутив redhat-family:

echo 'export LD_LIBRARY_PATH=/usr/local/oracle/lib' > /etc/profile.d/oracle

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

$ sudo editor /etc/ld.so.conf.d/railslibs

Добавьте путь, который вы указали в своем вопросе, к этому файлу и запустите sudo ldconfig,

Это должно сделать ненужным.

Есть несколько способов сделать это, включая тот, который предлагает Insyte выше.

Однако, если вам нужно установить переменную окружения, которая не принадлежит /etc/ld.so.conf, вы также можете просто поместить ее в /etc/environment

Другие вопросы по тегам