Занимаюсь разработкой рельсов. В этом приложении мне нужно указать переменную среды 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
.
Здесь имеет значение способ доступа к корневому пользователю. Различные методы «входа в систему» создают разные среды.
Например:
.bashrc
при запуске.bash_profile
при запуске.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.