Tomcat服务没有看到$ JAVA_HOME

我想在CentOS 7上用Systemd设置一个Tomcat服务。

我已经将Oracle Java 1.8u74安装到/usr/java/jdk1.8.0_74并在启动时设置了环境variables$ JAVA_HOME,如下所示:

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

当我login到系统时,我可以运行echo $JAVA_HOME并查看正确的path。

我已经安装了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并没有find$ JAVA_HOME,但我期望它find$ JAVA_HOME,因为它在/etc/profile.d/setenv.sh

是否由于启动顺序(即setenv.sh在Systemd启动后运行)未find?

我把setenv.sh放在错误的地方了吗?

处理这个问题的最好方法是什么?

这是systemd的预期行为。

要理解systemd服务运行的环境,可以参考man systemd.exec ,特别是ENVIRONMENT VARIABLES IN SPAWNED PROCESSES一节。 正如它所说的,只有很less的variables被设置,你必须自己设置其他的东西。

只是碰巧/etc/profile.d中的文件来自交互式shell,这就是为什么当你login时你可以看到variables。你所做的正是本教程所build议的,所以你可以坚持下去。 如果您担心Java升级会破坏您的单元文件,您可以创build符号链接到您的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' 

我会亲自坚持你已经有的。