созданный пользователь не имеет доступа к переменной окружения

Вопрос или проблема

Я следовал этим инструкциям, чтобы установить 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. Вместо того, чтобы указывать переменные окружения непосредственно в файле сервиса, вы можете создать файл окружения.

Шаги для создания файла окружения:

  1. Создайте файл, например, /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
  2. Внесите изменения в файл /etc/systemd/system/tomcat.service, добавив строку для загрузки этого файла:

    EnvironmentFile=/etc/default/tomcat
  3. Перезагрузите конфигурацию systemd:

    sudo systemctl daemon-reload
  4. Попробуйте перезапустить Tomcat:

    sudo systemctl restart tomcat

5. Проверка статуса сервиса

После применения изменений проверьте статус сервиса:

sudo systemctl status tomcat

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

6. Дополнительные диагностические шаги

Если проблема сохраняется, проверьте логи Tomcat и системные журналы:

journalctl -xeu tomcat.service

Это позволит вам получить более детальную информацию о том, что именно идет не так.

Заключение

Несмотря на то что переменные окружения могут применяться в пользовательских средах, система systemd требует явного указания окружения для служб. Применение файла окружения и убедившись в доступе переменных для пользователя tomcat, скорее всего, решит вашу проблему. Если у вас остались вопросы или возникли дополнительные сложности, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...