在 Tomcat webapp 自动取消设置后,如何设置 $LD_LIBRARY_PATH?

在 Tomcat webapp 自动取消设置后,如何设置 $LD_LIBRARY_PATH?

LD_LIBRARY_PATH我有一个需要设置的Tomcat webapp 。

我正在使用 RHEL6 和 Tomcat6(来自 yum 包管理器),webapp 名为adore-djatoka

我使用提供的脚本来导出一些环境变量来启动 tomcat,但看起来这些变量LD_LIBRARY_PATH没有被设置,我认为这是安全特性,因为 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,但发现它为空,因此它会kdu_compress在目录中查找null/

我已经将启动脚本弄得乱七八糟,echo以便我可以看到它LD_LIBRARY_PATH正在被设置和导出,所以我假设它一定是被取消设置了。

webapp 捆绑了几个脚本来测试它是否安装正确,并且它们可以从命令行正常运行,但它们非常短,它们只是导出环境变量(包括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?或者在它被设置为 null 之后,如何将其重新设置为我想要的值?或者如何阻止 webapp 依赖它?

干杯,

答案1

您真正需要的是将适当的标志放入您的 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

答案2

我最终解决了这个问题,通过抓取 webapp 的源代码,将所需路径硬编码到相关行中,进行编译和重新部署。

有问题的路径只是作为源中的字符串拉出,因此不需要将其存储在 LD_LIBRARY_PATH 中。

为了使其更具可移植性,我应该删除硬编码并将其替换为对配置脚本中设置的自定义环境变量的调用。

这意味着,据我所知,“在 setuid 程序范围内取消设置 LD_LIBRARY_PATH 环境变量后,如何设置它”的答案是“你不能,除非程序本身具有在执行后传递此信息的功能”。

答案3

使用 TOMCAT7,只需设置一个夫妻$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"

事实上,tomcat.conf 中的每个 <tag>="<value> 行都变成了“export <tag>=<value>”(例如,对 Tomcat 服务启动脚本进行逆向工程:/etc/init.d/tomcat)。

您还可以在 /etc/sysconfig/tomcat 中为您可能已配置的所有 TOCAT 服务全局重载该值。

因此,如果 tomcat.conf 中的设置看起来没有效果,请检查 /etc/sysconfig/tomcat 可能过载的内容...

相关内容