У меня есть веб-приложение Tomcat, которому требуется LD_LIBRARY_PATH
быть установленным.
Я использую RHEL6 и Tomcat6 (из диспетчера пакетов yum), веб-приложение называется adore-djatoka
.
Я запускаю tomcat с помощью прилагаемого скрипта, который экспортирует ряд переменных среды, но похоже, что LD_LIBRARY_PATH
не установлен, я думаю, это функция безопасности, поскольку сценарий инициализации запускается пользователем "root
"но кот работает как"tomcat
".
Когда я перезапускаю tomcat, я вижу в файле журнала следующую строку:djatoka.log
"
2013-01-04/10:25:04.118/EST [main] DEBUG envParams: LD_LIBRARY_PATH=null | null/kdu_compress
Я прочитал, что говорит мне, что приложение ожидает, что LD_LIBRARY_PATH будет установлен, но обнаруживает, что он равен нулю, и, следовательно, он будет искать kdu_compress
в каталоге null/
.
Я засорил скрипт запуска echo
так что я вижу это LD_LIBRARY_PATH
устанавливается и экспортируется, поэтому я предполагаю, что он не установлен.
В комплект поставки веб-приложения входит пара скриптов для проверки правильности установки, и они отлично работают из командной строки, но они очень короткие, они просто экспортируют переменные среды (включая LD_LIBRARY_PATH
) и вызовите java.
Я пробовал добавить
LD_LIBRARY_PATH="/opt/adore-djatoka-1.1/lib/Linux-x86-64"
export LD_LIBRARY_PATH
к /usr/share/tomcat6/bin/setenv.sh
Я пробовал добавить
LD_LIBRARY_PATH="/opt/adore-djatoka-1.1/lib/Linux-x86-64"
в `/etc/tomcat6/tomcat6.conf
LD_LIBRARY_PATH
уже экспортирован в сценарий запуска, который продолжает вызывать /etc/init.d/tomcat6 [start/stop/restart]
Я новичок в нескольких предметах здесь, поэтому я также буду признателен за некоторые рекомендации о том, как лучше понять, где искать дальше или какую информацию было бы полезно опубликовать. Я уже читал "почему LD_LIBRARY_PATH плохой"
Итак, мой вопрос в том, как я могу запустить tomcat, чтобы он не устанавливал LD_LIBRARY_PATH
обнулить? или как я могу переустановить его на то, что я хочу, после того, как он был установлен на null? или как я могу сделать так, чтобы веб-приложение не зависело от него?
Привет,
На самом деле вам нужно было поставить соответствующий флаг в JAVA_OPTS (что немного противоречит здравому смыслу).
В поле RHEL поместите это в / etc / sysconfig / tomcat6 или /etc/tomcat6/tomcat.conf
JAVA_OPTS="-Xminf0.1 -Xmaxf0.3 -Xms1536m -Xmx1536m -XX:MaxPermSize=512m -Djava.awt.headless=true -DdjatokaUri=//thing.example.com/adore-djatoka -Dkakadu.home=/opt/adore-djatoka/bin/Linux-x86-64 -DLD_LIBRARY_PATH=/opt/adore-djatoka/lib/Linux-x86-64"
Вы можете проверить, что это установлено в Java, используя следующее:
# tr '\0' '\n' < /proc/$(pidof java)/environ
а также увидеть в журнале djatoka следующее:
2015-08-31/08:33:01.683/NZST [http-bio-8080-exec-1] DEBUG envParams: LD_LIBRARY_PATH=/opt/adore-djatoka/lib/Linux-x86-64 | /opt/adore-djatoka/bin/Linux-x86-64/kdu_expand
Или вы можете просто установить его глобально (в таком файле, как /etc/ld.so.conf.d/adore-djatoka)
# echo "/opt/adore-djatoka/lib/Linux-x86-64" > /etc/ld.so.conf.d/adore-djatoka
# ldconfig
С TOMCAT 7, просто установив пара строк в $ CATALINA_HOME / conf / tomcat.conf решила проблему (где библиотека с именем, например, Crypto становится libCrypto.so):
JAVA_OPTS="-Djava.library.path=/usr/share/tomcat/sharedLibs"
# NOTE: the above instructs only the JVM, the next is ALSO required by native libs to load dependent native libs!
LD_LIBRARY_PATH="/usr/share/tomcat/sharedLibs"
Дело в том, что каждая строка <tag> = "<value>" в tomcat.conf становится "export <tag> = <value>" (например, реконструируйте сценарий запуска службы Tomcat: /etc/init.d/tomcat) .
Вы также можете перегрузить значение глобально в / etc / sysconfig / tomcat для всех служб TOMCAT, которые вы, возможно, настроили.
Следовательно, если настройки в tomcat.conf выглядят неэффективными, проверьте, что / etc / sysconfig / tomcat может перегружать ...
В конце концов я решил эту проблему, взяв исходный код веб-приложения, жестко закодировав требуемый путь в соответствующей строке, скомпилировав и повторно развернув.
Рассматриваемый путь был просто извлечен как строка в источнике, поэтому не требовалось, чтобы он хранился в LD_LIBRARY_PATH.
Чтобы сделать его более переносимым, я должен удалить жесткое кодирование и заменить его вызовом пользовательской переменной среды, установленной в сценарии конфигурации.
Это означает, насколько мне известно, ответ на вопрос «Как установить переменную среды LD_LIBRARY_PATH после того, как она не установлена в рамках программы setuid», будет: «Вы не можете, если сама программа не имеет средства для передача этой информации после выполнения ".