Назад | Перейти на главную страницу

Сервис Tomcat не видит $ JAVA_HOME

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

Я установил 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.

Мои вопросы

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

Чтобы понять, в какой среде работают службы systemd, вы можете обратиться к man systemd.exec, в частности раздел ENVIRONMENT VARIABLES IN SPAWNED PROCESSES. Как говорится, установлено очень мало переменных, и вы должны сами установить все остальное.

Так уж случилось, что файлы в /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'

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