我想在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'
我会亲自坚持你已经有的。