LD_LIBRARY_PATH
を設定する必要があるTomcatWebアプリケーションがあります。
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が設定されることを期待しているが、nullであることがわかったため、ディレクトリ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
to /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に設定した後、必要なものに再設定するにはどうすればよいですか?または、Webアプリがそれに依存するのを防ぐにはどうすればよいですか?
乾杯、
私は最終的に、webappのソースを取得し、必要なパスを関連する行にハードコーディングし、コンパイルして再デプロイすることで、この問題を回避しました。
問題のパスはソース内の文字列として単純に抽出されたため、LD_LIBRARY_PATHに格納する必要はありませんでした。
移植性を高めるには、ハードコーディングを削除して、構成スクリプトで設定されたカスタム環境変数の呼び出しに置き換える必要があります。
つまり、私の知る限り、「setuidプログラムのスコープ内で設定を解除した後、LD_LIBRARY_PATH環境変数を設定するにはどうすればよいですか」という答えは、「プログラム自体に次の機能がない限り、できません。実行後にこの情報を渡す」。
実際に必要なのは、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にcoupleの行を設定するだけで、問題が解決しました(たとえば、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) 。
構成した可能性のあるすべてのTomcatサービスについて、/ etc/sysconfig/Tomcatで値をグローバルにオーバーロードすることもできます。
したがって、Tomcat.confの設定が効果がないように見える場合は、/ etc/sysconfig/Tomcatが過負荷になる可能性があるものを確認してください...