Я написал серверное приложение Java, работающее на стандартном виртуальном хостинге Linux. Приложение все время работает, отслеживая соединения сокетов и создавая для них новые обработчики. Это серверная реализация клиент-серверного приложения.
Я начинаю это с включения в сценарий запуска rc.local сервера. Однако после запуска я не знаю, как получить к нему доступ, чтобы остановить его, и хочу ли я установить обновление, поэтому мне нужно перезапустить сервер, чтобы перезапустить приложение.
На ПК с Windows для этого типа приложений я могу создать службу Windows, а затем остановить и запустить ее по своему усмотрению. Есть ли что-нибудь подобное в коробке с Linux, чтобы, если я запустил это приложение, я мог остановить его и перезапустить без полного перезапуска сервера.
Мое приложение называется WebServer.exe. Он запускается при запуске сервера, включая его в мой rc.local как таковой:
java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &
Я немного новичок в Linux, поэтому любой пример будет оценен с любыми постами. Однако у меня есть SSH и полный FTP-доступ к серверу для установки любых обновлений, а также доступ к панели Plesk.
Простое решение - создать скрипт start.sh, который запускает Java через nohup, а затем сохраняет PID в файл:
Затем ваш стоп-скрипт stop.sh прочитает PID из файла и убьет приложение:
Конечно, я упустил некоторые детали, такие как проверка существования процесса и удаление,
pid.txt
если вы закончили.источник
Скрипт инициализации службы Linux хранится в файлах
/etc/init.d
. Вы можете скопировать и настроить/etc/init.d/skeleton
файл, а затем позвонитьсм. http://www.ralfebert.de/blog/java/debian_daemon/ . Это для Debian (как и для Ubuntu), но подходит для большего распространения.
источник
Может быть, это не лучшее решение для разработчиков, но хорошо для общего использования сервера для локальной сети или чего-то подобного.
Используйте
screen
для запуска сервера, а затем отсоедините его перед выходом из системы, это будет поддерживать процесс, и вы можете повторно подключиться в любой момент.Процедура:
Запустить экран:
screen
Запустите свой сервер:
java -jar minecraft-server.jar
Отделить нажатием:
Ctl-a
,d
Повторно приложить:
screen -r
Подробнее здесь: https://www.gnu.org/software/screen/manual/screen.html
источник
Другой альтернативой, которая также довольно популярна, является Java Service Wrapper . Это также довольно популярно в сообществе OSS.
источник
Ссылаясь также на приложение Spring Boot как услугу , я бы выбрал
systemd
версию, поскольку это самый простой, наименее подробный и лучше всего интегрированный в современные дистрибутивы (и даже не такие современные, как CentOS 7.x).источник
Самый простой способ - использовать
supervisord
. Пожалуйста, смотрите полную информацию здесь: http://supervisord.org/Больше информации:
/ubuntu/779830/running-an-executable-jar-file-when-the-system-starts/852485#852485
https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps
источник
Вот пример сценария оболочки (убедитесь, что вы заменили имя MATH на имя вашего приложения):
источник
Из приложения Spring Boot as a Service я могу порекомендовать приложение на основе Python
supervisord
. См. Этот вопрос о переполнении стека для получения дополнительной информации. Это действительно просто настроить.источник
supervisord
отлично, для тех, кто не знает, он позволяет контролировать службы (что должно бытьforeground
- нетdaemonized
), затем он автоматически перезапускает службы (и можетДругие ответы хорошо справляются с предоставлением настраиваемых сценариев и настроек в зависимости от вашей платформы. В дополнение к этим, вот зрелые программы специального назначения, о которых я знаю:
источник
Вы можете использовать сервер Thrift или JMX для связи со своей службой Java.
источник
Из Справочного руководства по Spring Boot
Продолжайте читать, чтобы узнать, как защитить развернутую службу.
После выполнения написанного я обнаружил, что моя служба не запускается с этим сообщением об ошибке в журналах: start-stop-daemon: unrecognized option --no-close . И мне удалось это исправить, создав файл конфигурации
/var/myapp/myapp.conf
со следующим содержимымисточник
У меня есть Java-приложение Netty, и я хочу запустить его как службу с помощью systemd. К сожалению, приложение останавливается независимо от того, какой тип я использую. В конце я завернул java start в screen. Вот файлы конфигурации:
служба
Начало
с этого момента вы можете использовать
systemctl [start|stop|status] service
.источник
Для запуска кода Java в качестве демона (службы) вы можете написать заглушку на основе JNI.
http://jnicookbook.owsiak.org/recipe-no-022/
для примера кода, основанного на JNI. В этом случае вы демонизируете код, который был запущен как Java, и основной цикл выполняется на C. Но также можно поместить основной, демонический, служебный цикл внутри Java.
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo029
Удачи с JNI!
источник
Вы можете написать простой сценарий остановки, который ищет ваш java-процесс, извлекает PID и вызывает для него kill. Это не причудливо, но все просто. Для начала может помочь что-то вроде этого:
источник
pkill nameofprocess
умею делать то же самое?Можно запустить войну как службу Linux, и вы можете принудительно добавить файл pom.xml перед упаковкой, поскольку некоторые дистрибутивы могут не распознавать в автоматическом режиме. Для этого добавьте в плагин spring-boot-maven-plugin следующее свойство.
Затем настройте свой init.d с помощью:
и ты сможешь бежать
Есть много других вариантов, которые вы можете найти в документации Spring Boot , включая службу Windows.
источник