Вопрос или проблема
Почему при запуске 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)
- Конфигурация systemd: В вашем файле конфигурации указано, что сервис должен выполняться под пользователем
yumia
и зависит отmysql.service
, что подразумевает, что MySQL должен быть запущен перед вашим приложением. - Ошибка доступа: Вы упоминаете, что при старте приложения возникает ошибка "отказ в доступе" к MySQL, когда вы запускаете его через systemd, но доступ появляется, когда вы останавливаете и снова запускаете сервис.
- SELinux: Вы указали, что SELinux отключен, что исключает возможность блокировки доступа из-за этой системы безопасности.
Возможные проблемы (Observations)
- Права доступа пользователя: Убедитесь, что пользователь
yumia
имеет необходимые разрешения для подключения к MySQL. Особенно это важно, если MySQL настроен так, что определяет доступ по пользователю и хосту. - Настройки MySQL: Как пользователь
yumia
может ли он подключаться к MySQL? Проверьте, были ли предоставлены права доступа пользователюuser1
, который указан вDB_URL
. - Влияние переменных окружения: Переменные окружения, указанные в вашем файле конфигурации, могут также влиять на выполнение команды в
ExecStartPre
. Удостоверьтесь, что они корректно передаются. - Необходимость ожидания: Иногда MySQL может быть не полностью готов к моменту, когда ваше приложение пытается к нему подключиться. Задержка в
ExecStartPre
позволяет решить эту проблему, но важно удостовериться, что MySQL действительно запущен перед выполнением.
Решения (Solutions)
-
Проверка прав доступа:
- Убедитесь, что у пользователя
user1
есть необходимые права привилегий. Выполните следующий SQL-запрос:GRANT ALL PRIVILEGES ON healthsys.* TO 'user1'@'localhost' IDENTIFIED BY '1234'; FLUSH PRIVILEGES;
- Убедитесь, что у пользователя
-
Отладка подключения:
- Попробуйте вручную подключиться к MySQL с помощью пользователя
user1
из терминала, используя следующие команды:/usr/local/mysql/bin/mysql -h localhost -u user1 -p1234
- Если это сработает, проблема может заключаться в специфике вашего systemd-сервиса.
- Попробуйте вручную подключиться к MySQL с помощью пользователя
-
Дополнительные журналы:
- Проверьте журналы сервиса для получения более детальной информации об ошибках. Используйте команду:
journalctl -u app.service
- Проверьте журналы сервиса для получения более детальной информации об ошибках. Используйте команду:
-
Обновление systemd:
- Если вы изменили конфигурацию, не забудьте перезагрузить конфигурацию systemd:
sudo systemctl daemon-reload
- Если вы изменили конфигурацию, не забудьте перезагрузить конфигурацию systemd:
-
Дебаггинг с помощью
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
файла и использовать отладочные команды для выявления потенциальных ошибок. Правильная диагностика поможет вам добиться стабильной работы вашего приложения и корректного взаимодействия с базой данных.