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