Linux

Tomcat 服務看不到 $JAVA_HOME

  • January 16, 2018

我正在嘗試在 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'

我個人會堅持你已經擁有的。

引用自:https://serverfault.com/questions/764741