Я написал сценарий оболочки для управления приложениями Play Framework, упакованными с помощью встроенной команды dist
. Приложения, упакованные таким образом, представляют собой автономные дистрибутивы в формате zip без необходимости устанавливать Play Framework на компьютере, на котором он должен работать. Все необходимое находится внутри упаковки. Внутри zip в каталоге bin находится исполняемый скрипт оболочки, который называется так же, как ваше приложение. Вы можете запустить свое приложение, запустив этот скрипт. Это все, что он делает, но я хочу больше.
Настройка скрипта
Скачайте скрипт с GitHub и сделайте его исполняемым:
1
|
chmod +x . /dist-play-app-initd |
Перед запуском скрипта необходимо установить значения переменных NAME , PORT и APP_DIR .
- NAME — имя приложения, должно совпадать с именем сценария оболочки, сгенерированным платформой Play для запуска приложения.
- PORT — номер порта, на котором должно работать приложение
- APP_DIR — путь к каталогу, в который вы распаковали упакованное приложение
Давайте возьмем мой побочный проект Jugjane в качестве примера. Я запустил « play dist
», и он сгенерировал файл « jugjane-1.1-SNAPSHOT.zip ». Если я распаковываю его, я получаю один каталог с именем « jugjane-1.1-SNAPSHOT », который я перемещаю в « /home/rado/bin/jugjane-1.1-SNAPSHOT ». Сценарий оболочки, сгенерированный платформой Play, называется « /home/rado/bin/jugjane-1.1-SNAPSHOT/bin/jugjane ». Я хотел бы запустить приложение на порт 9000. Мои значения будут:
1
2
3
|
NAME=jugjane PORT=9000 APP_DIR= /home/rado/bin/jugjane-1 .1-SNAPSHOT |
Запустить, остановить, перезапустить и проверить статус
Теперь я могу легко запустить свое приложение Play в качестве демона. Давайте запустим это.
Начните
Чтобы запустить мое приложение Jugjane, я просто запускаю следующее:
1
2
|
$ . /dist-play-app-initd start Starting jugjane at port 9000... OK [PID=6564] |
Рестарт
1
2
3
|
$ . /dist-play-app-initd restart Stopping jugjane... OK [PID=6564 stopped] Starting jugjane at port 9000... OK [PID=6677] |
Статус
1
2
|
$ . /dist-play-app-initd status Checking jugjane at port 9000... OK [PID=6677 running] |
Стоп
1
2
|
$ . /dist-play-app-initd stop Stopping jugjane... OK [PID=6677 stopped] |
Запустите приложение, когда машина запустится
Это зависит от вашей операционной системы, но обычно вам нужно переместить этот скрипт в каталог /etc/init.d .
Детали реализации
Сценарий использует файл RUNNING_PID, сгенерированный платформой Play, который содержит идентификатор процесса сервера приложений.
Безопасный старт
После запуска приложения скрипт проверяет, был ли создан файл RUNNING_PID и действительно ли процесс запущен. После этого он использует утилиту wget для выдачи HTTP-запроса GET для корневого документа, чтобы еще раз проверить, работает ли сервер. Конечно, это предполагает, что ваше приложение обслуживает этот документ. Если вам не нравится (или у вас есть) wget, для вашего удобства я также предоставил версию curl .
Безопасная остановка
Stop проверяет, действительно ли процесс, чей идентификатор находится в файле RUNNING_PID, принадлежит вашему приложению. Это важная проверка, чтобы мы не убили невинный процесс случайно. Затем он посылает сигналы завершения процессу, начиная с самых мягких, пока процесс не умирает.
Вклад
Я благодарю моего работодателя Dominion Marine Media, который позволил мне поделиться этой радостью с вами. Не стесняйтесь вносить свой вклад.