Как правильно настроить приложение Spring Boot, упакованное как исполняемый jar-файл как Сервис в системе Linux? Это рекомендуемый подход, или я должен преобразовать это приложение в войну и установить его в Tomcat?
В настоящее время я могу запустить загрузочное приложение Spring из screen
сеанса, что неплохо, но требует перезагрузки вручную после перезагрузки сервера.
То, что я ищу, это общий совет / направление или пример init.d
сценария, если мой подход с исполняемым jar является правильным.
service
startup
init.d
spring-boot
MariuszS
источник
источник
Ответы:
Следующие работы для Springboot 1.3 и выше:
В качестве службы init.d
Исполняемый файл jar содержит обычные команды start, stop, restart и status. Он также настроит PID-файл в обычном каталоге / var / run и войдет в обычный каталог / var / log по умолчанию.
Вам просто нужно добавить ссылку на ваш jar-файл в /etc/init.d примерно так
ИЛИ
После этого вы можете сделать обычное
Затем установите ссылку в зависимости от того, какой уровень запуска вы хотите, чтобы приложение запускалось / останавливалось при загрузке, если это необходимо.
Как системный сервис
Чтобы запустить приложение Spring Boot, установленное в var / myapp, вы можете добавить следующий скрипт в /etc/systemd/system/myapp.service:
Примечание: если вы используете этот метод, не забудьте сделать сам файл jar исполняемым (с помощью chmod + x), иначе он завершится с ошибкой «Отказано в доступе».
Ссылка
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
источник
<executable>true</executable>
к своемуpom.xml
, но упакованный файл JAR не выполняется (...../myapp.jar ... cannot execute binary file
)-Dspring.profiles.active=prod
эти услуги? Вопрос - stackoverflow.com/questions/31242291/…/etc/init.d stop
не останавливает приложение, оно пытается запустить его снова.Далее следует самый простой способ установить приложение Java в качестве системной службы в Linux.
Давайте предположим, что вы используете
systemd
(что делает любой современный дистрибутив):Во-первых, создайте файл службы с
/etc/systemd/system
именем, например,javaservice.service
с таким содержанием:Во-вторых, уведомить
systemd
о новом файле сервиса:и включите его, чтобы он работал при загрузке:
В конце концов, вы можете использовать следующие команды для запуска / остановки вашей новой службы:
При условии, что вы используете
systemd
, это самый ненавязчивый и чистый способ настроить приложение Java как системный сервис.Что мне особенно нравится в этом решении, так это то, что вам не нужно устанавливать и настраивать любое другое программное обеспечение. Поставленный продукт
systemd
выполняет всю работу за вас, а ваш сервис работает как любой другой системный сервис. Некоторое время я использую его в производстве, в разных дистрибутивах, и он просто работает, как и следовало ожидать.Еще одним плюсом является то, что, используя
/usr/bin/java
, вы можете легко добавлятьjvm
параметры, такие как-Xmx256m
.Также прочтите эту
systemd
часть в официальной документации Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html.источник
[Unit]
раздел, напримерAfter=mysql.service
,Before=apache2.service
.Вы также можете использовать supervisord - очень удобный демон, который можно использовать для простого управления сервисами. Эти сервисы определяются простыми конфигурационными файлами, определяющими, что выполнять с каким пользователем, в каком каталоге и т. Д. Существуют миллионы опций. supervisord очень простой синтаксис, поэтому он является очень хорошей альтернативой написанию сценариев инициализации SysV.
Вот простой файл конфигурации супервизора для программы, которую вы пытаетесь запустить / контролировать. (поместите это в /etc/supervisor/conf.d/yourapp.conf )
/etc/supervisor/conf.d/yourapp.conf
Для управления приложением вам необходимо выполнить supervisorctl , который предоставит вам подсказку, где вы можете запустить, остановить, состояние yourapp.
CLI
Если
supervisord
демон уже запущен и вы добавили конфигурацию для своей службы без перезапуска демона, вы можете просто выполнить команду areread
иupdate
вsupervisorctl
оболочке.Это действительно дает вам все гибкие возможности, которые вы имели бы при использовании сценариев SysV Init, но прост в использовании и управлении. Посмотрите на документацию .
источник
systemd
, что и встроенная в большинство современных дистрибутивов Linux.Я только что занялся этим сам, поэтому ниже я дошел до сценария контроллера службы CentOS init.d. Пока он работает довольно хорошо, но я не хакер Bash, так что я уверен, что есть возможности для улучшений, так что мысли об улучшении приветствуются.
Прежде всего, у меня есть короткий конфигурационный скрипт
/data/svcmgmt/conf/my-spring-boot-api.sh
для каждого сервиса, который устанавливает переменные среды.Я использую CentOS, поэтому, чтобы мои службы запускались после перезапуска сервера, у меня есть сценарий управления службами
/etc/init.d/my-spring-boot-api
:Как вы можете видеть, он вызывает сценарий начальной настройки для настройки переменных среды, а затем вызывает общий сценарий, который я использую для перезапуска всех моих служб Spring Boot. В этом общем сценарии можно найти суть всего этого:
При остановке он попытается использовать Spring Boot Actuator для выполнения управляемого останова. Однако, если Actuator не настроен или не может отключиться в течение разумного периода времени (я даю ему 5 секунд, что на самом деле немного мало), процесс будет остановлен.
Кроме того, сценарий предполагает, что java-процесс, выполняющий приложение, будет единственным с «my-spring-boot-api.jar» в тексте деталей процесса. Это безопасное предположение в моей среде и означает, что мне не нужно отслеживать PID.
источник
java -jar
. Остальная часть сценария все еще нужна.Если вы хотите использовать Spring Boot 1.2.5 с Spring Boot Maven Plugin 1.3.0.M2, вот вам решение:
Затем скомпилируйте как ususal:,
mvn clean package
создайте символическую ссылкуln -s /.../myapp.jar /etc/init.d/myapp
, сделайте ее исполняемойchmod +x /etc/init.d/myapp
и запустите ееservice myapp start
(с Ubuntu Server)источник
1.3.0.M2
, но я получил ошибку при попытке1.3.0.RC1
.springBoot { executable = true }
блока.Я знаю, что это старый вопрос, но я хотел представить еще один способ - appassembler-maven-plugin . Вот соответствующая часть из моего POM, которая включает в себя множество дополнительных значений параметров, которые мы сочли полезными:
источник
КАК WINDOWS СЕРВИС
Если вы хотите, чтобы это работало в машине Windows, загрузите winsw.exe из
После этого переименуйте его в jar filename (например: your-app .jar)
Теперь создайте xml-файл your-app.xml и скопируйте в него следующее содержимое.
Убедитесь, что exe и xml вместе с jar в одной папке.
После этого откройте командную строку в администраторе и установите ее в службу Windows.
Если это не с
Затем попробуйте следующее:
Это оно :) .
Чтобы удалить службу в Windows
Для просмотра / запуска / остановки службы: win + r и введите Администрирование, затем выберите службу из этого. Затем щелкните правой кнопкой мыши, выберите опцию - запустить / остановить
источник
Мой скрипт SysVInit для Centos 6 / RHEL (пока не идеально). Этот скрипт требует ApplicationPidListener .
Источник
/etc/init.d/app
Пример файла конфигурации
/etc/sysconfig/app
:источник
Вот скрипт, который развертывает исполняемый файл jar в качестве службы systemd.
Он создает пользователя для службы и файла .service и помещает файл jar в / var, а также выполняет базовую блокировку привилегий.
Пример:
источник
Я пытаюсь создать приложения Springboot, которые представлены в виде сценария оболочки в стиле «init.d» со сжатым Java-приложением, прикрепленным к концу.
Путем символической ссылки на эти сценарии из /etc/init.d/spring-app в /opt/spring-app.jar и chmod'ing jar, чтобы он был исполняемым, можно запустить "/etc/init.d/spring-app "/etc/init.d/spring-app stop" и другие возможности, такие как работа со статусом
Предположительно, поскольку скрипты стиля init.d из Springboot выглядят так, что они имеют необходимые магические строки (например,
# Default-Start: 2 3 4 5
), chkconfig сможет добавить его в качестве «службы»Но я хотел заставить его работать с systemd
Чтобы заставить это работать, я попробовал многие из получателей в других ответах выше, но ни один из них не работал для меня на Centos 7.2 с Springboot 1.3. В основном они запускали службу, но не могли отслеживать pid
В конце концов я обнаружил, что следующее сработало для меня, когда была установлена ссылка /etc/init.d. Файл, аналогичный приведенному ниже, должен быть установлен как
/usr/lib/systemd/system/spring-app.service
источник
Я закончил тем, что делал обслуживание systemd для разметки WAR / JAR
Я называю java -jar, потому что он более гибкий. Попытался также положить ExecStart = spring-mvc.war, но, несмотря на то, что это исполняемый файл, я получил «Ошибка формата Exec»
В любом случае, systemd присутствует во всех дистрибутивах и предлагает отличное решение для перенаправления журналов (syserr важен, когда ваша служба даже не запускает, местоположение файла log4j будет пустым :)).
rsyslog - перенаправить ввод системного журнала из приложения в определенную папку / файл
Logrotate
войти gc
источник
В этом вопросе ответ от @PbxMan должен помочь вам начать:
Запустите приложение Java как службу в Linux
Редактировать:
Есть другой, менее приятный способ запустить процесс при перезагрузке, используя cron:
Это работает, но не дает вам приятного интерфейса запуска / остановки для вашего приложения. Вы все еще можете просто
kill
это все равно ...источник
Я не знаю «стандартного» термоусадочного способа сделать это с помощью Java-приложения, но это определенно хорошая идея (вы хотите воспользоваться возможностями поддержки активности и мониторинга операционной системы, если они там есть) , В планах обеспечить что-то из поддержки инструментов Spring Boot (maven и gradle), но сейчас вам, вероятно, придется катиться самостоятельно. Лучшее решение, которое я знаю сейчас, - это Foreman , который имеет декларативный подход и однострочные команды для упаковки сценариев инициализации для различных стандартных форматов ОС (monit, sys V, upstart и т. Д.). Есть также свидетельства того, что люди настроили вещи с помощью gradle (например, здесь ).
источник
Вы используете Maven? Тогда вы должны попробовать плагин AppAssembler:
Смотрите: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
источник
Следующая конфигурация требуется в файле build.gradle в проектах Spring Boot.
build.gradle
Это необходимо для того, чтобы сделать полностью исполняемый jar в системе Unix (Centos и Ubuntu)
Создать файл .conf
Если вы хотите настроить пользовательские свойства JVM или аргументы запуска приложения Spring Boot, то вы можете создать файл .conf с тем же именем, что и имя приложения Spring Boot, и разместить его параллельно файлу jar.
Учитывая, что your-app.jar - это имя вашего приложения Spring Boot, вы можете создать следующий файл.
Эта конфигурация установит 64 МБ оперативной памяти для приложения Spring Boot и активирует профиль prod.
Создать нового пользователя в Linux
Для повышения безопасности мы должны создать конкретного пользователя для запуска приложения Spring Boot в качестве службы.
Создать нового пользователя
В Ubuntu / Debian измените приведенную выше команду следующим образом:
Установка пароля
Сделать Springboot владельцем исполняемого файла
Предотвратить изменение файла JAR
Это настроит права доступа jar так, что он не может быть записан и может быть прочитан или выполнен только его владельцем springboot.
При желании вы можете сделать свой JAR-файл неизменным, используя команду change attribute (chattr).
Соответствующие разрешения должны быть установлены и для соответствующего файла .conf. .conf требует только доступа на чтение (Octal 400) вместо доступа на чтение + выполнение (Octal 500)
Создать сервис Systemd
/etc/systemd/system/your-app.service
Автоматический перезапуск процесса, если он убит ОС
Добавьте следующие два атрибута (Restart и RestartSec), чтобы автоматически перезапустить процесс при сбое.
/etc/systemd/system/your-app.service
Это изменение приведет к перезагрузке приложения Spring Boot в случае сбоя с задержкой в 30 секунд. Если вы остановите службу с помощью команды systemctl, перезапуск не произойдет.
Расписание обслуживания при запуске системы
Чтобы пометить приложение для автоматического запуска при загрузке системы, используйте следующую команду:
Включить приложение Spring Boot при запуске системы
Начать Остановить Сервис
systemctl может использоваться в Ubuntu 16.04 LTS и 18.04 LTS для запуска и остановки процесса.
Начать процесс
Остановить процесс
Ссылки
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
источник
В ответ на превосходный ответ Чада, если вы получите сообщение об ошибке «Ошибка: не удалось найти или загрузить основной класс» - и вы потратите пару часов на его устранение, будь то выполнение сценария оболочки, запускающего ваше Java-приложение, или запуск его из самой systemd - и вы знаете, что ваш classpath верен на 100%, например, ручной запуск сценария оболочки работает так же, как и запуск того, что у вас есть в systemd execstart. Убедитесь, что вы работаете как правильный пользователь! В моем случае я пробовал разных пользователей, после долгого времени поиска и устранения неисправностей - у меня наконец-то появилась догадка, поставил root как пользователь - вуаля, приложение запустилось правильно. После определения, что это была неправильная проблема пользователя, я
chown -R user:user
папка и подпапки, а также приложение работали правильно как указанные пользователь и группа, поэтому больше не нужно запускать их как root (плохая защита)источник
В системных файлах systemd вы можете установить каталог переменных среды или через
EnvironmentFile
. Я бы предложил действовать таким образом, так как это кажется наименьшим трением.Пример файла модуля
Затем настройте файл, в
/etc/sysconfig/hello-world
который входят имена переменных Spring Boot в верхнем регистре. Например, вызываемая переменнаяserver.port
будетSERVER_PORT
иметь форму переменной окружения:Используемый здесь механизм заключается в том, что приложения Spring Boot возьмут список свойств, а затем переведут их, сделав все в верхнем регистре и заменив точки на подчеркивания. Как только приложение Spring Boot проходит через этот процесс, оно ищет переменные среды, которые соответствуют, и использует любые найденные соответственно.
Это выделено более подробно в этой статье вопросов и ответов под названием: Как установить свойство Spring Boot с подчеркиванием в его имени через переменные среды?
Ссылки
источник
Это можно сделать с помощью сервиса Systemd в Ubuntu.
Вы можете перейти по этой ссылке для более подробного описания и различных способов сделать это. http://www.baeldung.com/spring-boot-app-as-a-service
источник
Создайте скрипт с именем your-app.service (rest-app.service). Мы должны поместить этот скрипт в каталог / etc / systemd / system. Вот пример содержимого скрипта
Следующий:
Ссылки
введите описание ссылки здесь
источник