Служба Tomcat не видит $ JAVA_HOME

Я пытаюсь настроить службу Tomcat с помощью Systemd на CentOS 7.

I ' Мы установили 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 не в то место?
  • What ' s лучший способ справиться с этим?
5
задан 16 January 2018 в 17:20
1 ответ

Это ожидаемое поведение с systemd.

Чтобы понять, в какой среде работают службы systemd, вы можете обратиться к man systemd.exec , в частности к разделу ПЕРЕМЕННЫЕ ОКРУЖАЮЩЕЙ СРЕДЫ В ПОРОЖДЕННЫХ ПРОЦЕССАХ . В нем указано, что установлено очень мало переменных, и вы должны установить что-либо еще самостоятельно.

Просто так случилось, что файлы в /etc/profile.d были получены интерактивными оболочками, то есть почему вы можете видеть переменную при входе в систему. То, что вы сделали, - это именно то, что рекомендуется в руководстве, так что вы можете просто придерживаться этого. Если вас беспокоит, что обновление 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'

Я бы лично придерживался того, что у вас уже есть.

5
ответ дан 3 December 2019 в 01:36

Теги

Похожие вопросы