почему не удается запустить jar с помощью systemd, не могу получить доступ к mysql, ошибка пишет, что нет привилегий

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

Почему при запуске jar с помощью systemd не удается подключиться к mysql, ошибка сообщает, что нет привилегий. Я тестирую это в VMware. Пользователь, запускающий jar, будь то root или обычный пользователь, не может получить доступ из-за проблемы с привилегиями. Но когда я останавливаю свой app.service с помощью systemctl, а затем запускаю его, он получает привилегии. Почему? Я надеюсь, что systemd сделает это автоматически, и jar получит привилегии. И это мои настройки, Selinux отключен.

[Unit]
Description=Мое Java приложение  
Requires=mysql.service  
After=mysql.service

[Service]
User=yumia
WorkingDirectory=/home/yumia/myapp
Environment="IP=127.0.0.1"
Environment="DB_URL=jdbc:mysql://localhost:3306/healthsys?user=user1&password=1234"
ExecStartPre=/bin/bash -c 'while ! /usr/local/mysql/bin/mysql -h localhost -u root -p1234 -e "SELECT 1"; do sleep 1; done'
ExecStart=/usr/local/jdk/bin/java Dspring.application.json='{"ip":"${IP}"}' -jar /home/yumia/myapp/MySQLShiYan-0.0.1-SNAPSHOT.jar 
Restart=on-failure
RestartSec=5s
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Ответ или решение

Когда вы сталкиваетесь с проблемой доступа вашего Java-приложения к MySQL при его запуске через systemd, важно обратить внимание на настройки вашего сервиса и контекст запуска приложения. Давайте разберём основные причины проблемы "отказ в доступе" и предложим решения, используя формулу FOREST, чтобы облегчить понимание.

Факты (Facts)

  1. Конфигурация systemd: В вашем файле конфигурации указано, что сервис должен выполняться под пользователем yumia и зависит от mysql.service, что подразумевает, что MySQL должен быть запущен перед вашим приложением.
  2. Ошибка доступа: Вы упоминаете, что при старте приложения возникает ошибка "отказ в доступе" к MySQL, когда вы запускаете его через systemd, но доступ появляется, когда вы останавливаете и снова запускаете сервис.
  3. SELinux: Вы указали, что SELinux отключен, что исключает возможность блокировки доступа из-за этой системы безопасности.

Возможные проблемы (Observations)

  1. Права доступа пользователя: Убедитесь, что пользователь yumia имеет необходимые разрешения для подключения к MySQL. Особенно это важно, если MySQL настроен так, что определяет доступ по пользователю и хосту.
  2. Настройки MySQL: Как пользователь yumia может ли он подключаться к MySQL? Проверьте, были ли предоставлены права доступа пользователю user1, который указан в DB_URL.
  3. Влияние переменных окружения: Переменные окружения, указанные в вашем файле конфигурации, могут также влиять на выполнение команды в ExecStartPre. Удостоверьтесь, что они корректно передаются.
  4. Необходимость ожидания: Иногда MySQL может быть не полностью готов к моменту, когда ваше приложение пытается к нему подключиться. Задержка в ExecStartPre позволяет решить эту проблему, но важно удостовериться, что MySQL действительно запущен перед выполнением.

Решения (Solutions)

  1. Проверка прав доступа:

    • Убедитесь, что у пользователя user1 есть необходимые права привилегий. Выполните следующий SQL-запрос:
      GRANT ALL PRIVILEGES ON healthsys.* TO 'user1'@'localhost' IDENTIFIED BY '1234';
      FLUSH PRIVILEGES;
  2. Отладка подключения:

    • Попробуйте вручную подключиться к MySQL с помощью пользователя user1 из терминала, используя следующие команды:
      /usr/local/mysql/bin/mysql -h localhost -u user1 -p1234
    • Если это сработает, проблема может заключаться в специфике вашего systemd-сервиса.
  3. Дополнительные журналы:

    • Проверьте журналы сервиса для получения более детальной информации об ошибках. Используйте команду:
      journalctl -u app.service
  4. Обновление systemd:

    • Если вы изменили конфигурацию, не забудьте перезагрузить конфигурацию systemd:
      sudo systemctl daemon-reload
  5. Дебаггинг с помощью ExecStartPre:

    • Можно улучшить ExecStartPre, добавив установку дополнительных логов для понимания общей картины. К примеру:
      ExecStartPre=/bin/bash -c 'while ! /usr/local/mysql/bin/mysql -h localhost -u root -p1234 -e "SELECT 1"; do echo "Waiting for MySQL..." && sleep 1; done'

Заключение (Takeaway)

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

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

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