Linux
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, but I expect it to find $ JAVA_HOME 因為它設置在/etc/profile.d/setenv.sh
.我的問題
- 是否因為啟動順序(即 setenv.sh 在 Systemd 啟動後執行)而找不到?
- 我放
setenv.sh
錯地方了嗎?- 處理這個問題的最佳方法是什麼?
這是 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'
我個人會堅持你已經擁有的。