Я пытаюсь настроить службу 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.
Чтобы понять, в какой среде работают службы 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'
Я бы лично придерживался того, что у вас уже есть.