web-dev-qa-db-ja.com

Tomcatサービスは$ Java_HOMEを認識しません

CentOS 7でSystemdを使用してTomcatサービスをセットアップしようとしています。

私はOracle Java 1.8u74を/usr/Java/jdk1.8.0_74にインストールし、起動時に環境変数$Java_HOMEを次のように設定しました。

# echo "export Java_HOME=/usr/Java/jdk1.8.0_74" > /etc/profile.d/setenv.sh

システムにログインすると、echo $Java_HOMEを実行して正しいパスを確認できます。 Tomcatをインストールしましたが、Tomcat.serviceファイルには以下が含まれています。

# Systemd unit file for Tomcat

[Unit]
Description=Apache Tomcat
After=syslog.target network.target

[Service]
Type=forking

Environment=Java_HOME=/usr/Java/jdk1.8.0_74
Environment=CATALINA_PID=/opt/Tomcat/temp/Tomcat.pid
Environment=CATALINA_HOME=/opt/Tomcat
Environment=CATALINA_BASE=/opt/Tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='Java_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/Tomcat/bin/startup.sh
ExecStop=/opt/Tomcat/bin/shutdown.sh

User=Tomcat
Group=www

[Install]
WantedBy=multi-user.target

問題は、Environment=Java_HOME=/usr/Java/jdk1.8.0_74を読み取る行を省略した場合、Tomcatは$ Java_HOMEを見つけられないことですが、/etc/profile.d/setenv.shに設定されているため、$ Java_HOMEを見つけることが期待されます。

私の質問

  • ブートシーケンス(つまり、Systemdの起動後にsetenv.shが実行される)が原因で見つかりませんか?
  • setenv.shを間違った場所に配置しましたか?
  • これを処理する最良の方法は何ですか?
6
isapir

これは、systemdで予想される動作です。

Systemdサービスが実行される環境を理解するには、man systemd.exec、特にENVIRONMENT VARIABLES IN SPAWNED PROCESSESを参照してください。言うように、設定される変数はごくわずかであり、他に自分で設定する必要があります。

たまたま/etc/profile.dのファイルはインタラクティブシェルによって供給されているため、ログインすると変数が表示されます。これで、チュートリアルで推奨されているとおりの操作を実行できます。 Javaアップグレードするとユニットファイルが壊れるのではないかと心配している場合は、Javaインストールへのシンボリックリンクを作成するか、起動時にファイルを入手することもできます。

ExecStart=/bin/sh -c '. /etc/profile.d/setenv.sh; /opt/Tomcat/bin/startup.sh'
ExecStop=/bin/sh -c '. /etc/profile.d/setenv.sh; /opt/Tomcat/bin/shutdown.sh'

私はあなたがすでに持っているものに個人的に固執します。

6
chutz