Вопрос или проблема
Я следовал этим инструкциям, чтобы установить Tomcat на Ubuntu 22.04.
https://www.atlantic.net/dedicated-server-hosting/how-to-install-tomcat-10-on-ubuntu-22-04/
На моем ноутбуке все работало, но в моем KVM VM с Ubuntu 22.04 выдает следующее
wardog1@server002:~$ journalctl -xeu tomcat.service
22 дек 04:27:18 server002 startup.sh[1387]: Эта переменная окружения необходима для запуска этой программы
22 дек 04:27:18 server002 startup.sh[1387]: Обратите внимание: JAVA_HOME должен указывать на JDK, а не на JRE
22 дек 04:27:18 server002 systemd[1]: tomcat.service: Управляющий процесс завершил работу, код=выход, статус=1/НЕУДАЧА
░░ Тема: Процесс юнита завершился
░░ Определено: systemd
░░ Поддержка: http://www.ubuntu.com/support
░░
░░ Процесс ExecStart=, принадлежащий юниту tomcat.service, завершился.
░░
░░ Код выхода процесса 'выход' и его статус выхода 1.
GNU nano 6.2 /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 11 Web Application Server
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/home/wardog1/.sdkman/candidates/java/current"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
Переменные окружения идентичны на обоих машинах, но похоже, что JAVA_HOME не передается пользователю tomcat и не может быть захвачен в сервисе
wardog1@server002:~$ env | grep java
JAVA_HOME=/home/wardog1/.sdkman/candidates/java/current
PATH=/home/wardog1/.sdkman/candidates/java/current/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Ответ или решение
Проблема, с которой вы столкнулись, заключается в том, что созданный пользователь tomcat
не имеет доступа к переменной окружения JAVA_HOME
, необходимой для запуска Tomcat. Эта ситуация может возникнуть по нескольким причинам, особенно при использовании системы управления сервисами systemd
, как в вашем случае. Давайте разберем эту проблему и предложим пути ее решения.
1. Проверка конфигурации сервиса Tomcat
В вашем файле конфигурации /etc/systemd/system/tomcat.service
вы уже правильно указали переменные окружения, такие как JAVA_HOME
. Однако, несмотря на это, параметр не передается во время запуска сервиса.
2. Понимание контекста запуска
При запуске службы через systemd
сервисы работают в их собственных контекстах, что может отличаться от контекста пользователя, с которого вы выполняли команды. В частности, переменные окружения, определенные в пользовательских шеллах (например, в .bashrc
, .bash_profile
или .profile
), не применяются к контексту, в котором работает systemd
.
3. Проверка прав доступа
Убедитесь, что пользователь tomcat
, под которым запускается система, имеет доступ к указанному пути JAVA_HOME
. Попробуйте выполнить следующую команду от имени пользователя tomcat
:
sudo -u tomcat env | grep JAVA_HOME
Если переменная не отобразится, это означает, что она не доступна пользователю.
4. Установка переменных окружения
Чтобы убедиться, что переменные окружения доступны, можно попробовать изменить способ установки переменной JAVA_HOME
. Вместо того, чтобы указывать переменные окружения непосредственно в файле сервиса, вы можете создать файл окружения.
Шаги для создания файла окружения:
-
Создайте файл, например,
/etc/default/tomcat
и добавьте в него переменные окружения:# /etc/default/tomcat JAVA_HOME=/home/wardog1/.sdkman/candidates/java/current CATALINA_HOME=/opt/tomcat CATALINA_BASE=/opt/tomcat CATALINA_PID=/opt/tomcat/temp/tomcat.pid CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC
-
Внесите изменения в файл
/etc/systemd/system/tomcat.service
, добавив строку для загрузки этого файла:EnvironmentFile=/etc/default/tomcat
-
Перезагрузите конфигурацию
systemd
:sudo systemctl daemon-reload
-
Попробуйте перезапустить Tomcat:
sudo systemctl restart tomcat
5. Проверка статуса сервиса
После применения изменений проверьте статус сервиса:
sudo systemctl status tomcat
Это поможет подтвердить, что сервис работает корректно, и переменные окружения переданы правильно.
6. Дополнительные диагностические шаги
Если проблема сохраняется, проверьте логи Tomcat и системные журналы:
journalctl -xeu tomcat.service
Это позволит вам получить более детальную информацию о том, что именно идет не так.
Заключение
Несмотря на то что переменные окружения могут применяться в пользовательских средах, система systemd
требует явного указания окружения для служб. Применение файла окружения и убедившись в доступе переменных для пользователя tomcat
, скорее всего, решит вашу проблему. Если у вас остались вопросы или возникли дополнительные сложности, не стесняйтесь обращаться за помощью.