我有一个需要设置LD_LIBRARY_PATH
的Tomcat webapp。
我正在使用RHEL6和Tomcat6(来自yum包pipe理器),webapp被称为adore-djatoka
。
我使用提供的脚本启动tomcat,导出一些环境variables,但似乎LD_LIBRARY_PATH
未被设置,我认为这是一个安全function,因为init脚本是由用户“ root
”运行的,但是tomcat正在运行作为“ 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被设置,但是发现它是空的,因此它会在null/
目录中查找kdu_compress
。
我已经用echo
散布启动脚本,所以我可以看到LD_LIBRARY_PATH
正在被设置和导出,所以我假设它一定是未设置的。
有一些与webapp绑定的脚本来testing它的安装是否正确,并且它们在命令行中运行良好,但是它们很短,只是导出环境variables(包括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
设置为空? 或者如何将它设置为空后重新设置为我想要的? 或者我怎样才能阻止Web应用程序依赖它呢?
干杯,
你真正需要的是把一个适当的标志放入你的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"
您可以使用以下方法validation它是否在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
我最终通过抓取webapp的源码来解决这个问题,将所需的path硬编码到相关的行中,编译和重新部署。
所讨论的path只是作为源文件中的一个string提取出来,所以不需要将其存储在LD_LIBRARY_PATH中。
为了使它更具可移植性,我应该删除硬编码,并将其replace为在configuration脚本中设置的自定义环境variables的调用。
这就是说,就我所知,“如何在setuid程序范围内未设置LD_LIBRARY_PATH环境variables”的答案是“除非程序本身具有执行后传递这个信息“。