Статьи

Сценарий оболочки init.d для распределенных приложений Play Framework

Я написал сценарий оболочки для управления приложениями Play Framework, упакованными с помощью встроенной команды dist . Приложения, упакованные таким образом, представляют собой автономные дистрибутивы в формате zip без необходимости устанавливать Play Framework на компьютере, на котором он должен работать. Все необходимое находится внутри упаковки. Внутри zip в каталоге bin находится исполняемый скрипт оболочки, который называется так же, как ваше приложение. Вы можете запустить свое приложение, запустив этот скрипт. Это все, что он делает, но я хочу больше.

Настройка скрипта

Скачайте скрипт с GitHub и сделайте его исполняемым:

1
chmod +x ./dist-play-app-initd

Перед запуском скрипта необходимо установить значения переменных NAME , PORT и APP_DIR .

  1. NAME — имя приложения, должно совпадать с именем сценария оболочки, сгенерированным платформой Play для запуска приложения.
  2. PORT — номер порта, на котором должно работать приложение
  3. 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, который позволил мне поделиться этой радостью с вами. Не стесняйтесь вносить свой вклад.