Tomcat 服务没有看到 $JAVA_HOME

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,但我希望它能找到 $JAVA_HOME,因为它是在中设置的/etc/profile.d/setenv.sh

我的问题

  • 是否由于启动顺序而找不到它(即 setenv.sh 在 Systemd 启动后运行)?
  • 我是不是放setenv.sh错地方了?
  • 处理这个问题的最佳方法是什么?

答案1

这是 systemd 的预期行为。

要了解 systemd 服务运行的环境,您可以参考man systemd.exec,特别是部分ENVIRONMENT VARIABLES IN SPAWNED PROCESSES。正如它所说,只设置了很少的变量,其他的变量您都必须自己设置。

碰巧的是,中的文件/etc/profile.d是由交互式 shell 提供的,这就是为什么您在登录时可以看到变量的原因。您所做的正是本教程所建议的,因此您可以坚持下去。如果您担心 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'

我个人会坚持你已经拥有的东西。

相关内容