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

Как указать переменную окружения root?

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

Что мне делать, чтобы он работал? Пробовал поставить путь под корень ./bashrc и это не сработало.

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

Defaults    env_reset
Defaults    env_keep = "COLORS DISPLAY 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"

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

Defaults    env_keep = "COLORS DISPLAY 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.

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

Здесь имеет значение способ доступа к корневому пользователю. Различные методы «входа в систему» ​​создают разные среды.

Например:

  • Если ваша корневая оболочка - это bash, она будет читать .bashrc при запуске
  • Если bash - это ваша корневая оболочка, и это оболочка для входа в систему, она будет читать .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 -> su -> оболочка bash (корень) -> программное обеспечение.

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

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

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

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

Если это дистрибутив семейства redhat:

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

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

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

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

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

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

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

Это должно сделать ненужным изменение окружения.

Вы можете попробовать установить переменную среды из процесса рельсов, попробуйте добавить что-то вроде ниже в $ 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.