Erlang запускает приложение в производство

Когда я тестирую свое приложение erlang на локальном хосте, у меня есть скрипт, который запускает сервер, который выглядит следующим образом:

#!/bin/sh
PWD="$(pwd)"
NAME="$(basename $PWD)"
erl -pa "$PWD/ebin" deps/*/ebin -boot start_sasl \
    -name [email protected] \
    -s reloader \
    -s $NAME \
    -setcookie some_random_cookie \
    +K true \
    +P 65536 

Это предложит открыть оболочку Erlang, и оттуда я наберу что-то вроде:

application:start(myapp)

Это хорошо для целей разработки, но как мне развернуть это в производстве? На данный момент единственный способ, которым я могу это сделать, — запустить процесс экрана и отсоединиться от него. Я не думаю, что это должно быть так. Я использую арматуру, если это вообще помогает.


person randombits    schedule 11.08.2011    source источник


Ответы (3)


Похоже, вы хотите использовать собственный сценарий загрузки. Сценарий загрузки сообщает системе erlang, что следует запускать. В сценарии, который вы используете, вы устанавливаете сценарий загрузки с помощью:

-boot start_sasl

http://www.erlang.org/doc/system_principles/system_principles.html , ищем раздел "Определяемые пользователем скрипты загрузки"

Более простым вариантом может быть преобразование вашего приложения для использования арматуры: https://github.com/basho/rebar. Затем вы сможете сделать следующее:

./rebar compile generate

Это создаст выпуск для приложения, что позволит вам:

./rel/<app_name>/bin/<app_name>

Те же принципы, просто все упаковано для удобства использования.

person Lord Null    schedule 11.08.2011
comment
Обратите внимание, что он уже упоминает, что используется арматура. Ваш ответ был бы намного лучше, если бы вы объяснили, как написать арматурный стержень reltool.config. - person Daniel Luna; 12.08.2011

Добавьте параметр -detached. В документации это прекрасно описано:

Запускает систему выполнения Erlang, отсоединенную от системной консоли. Полезно для запуска демонов и фоновых процессов.

Как только вы это сделаете, вы сможете запустить свое приложение с параметром -s. Предполагая, что $NAME = myapp, init попытается вызвать myapp:start/0 (вы можете настроить это, если хотите). Эта функция должна заканчиваться вызовом application:start(myapp).

Если вы сможете собрать все эти кусочки головоломки на место, у вас должен быть работающий сценарий.

person David Weldon    schedule 11.08.2011

Что ж, вы можете попробовать подключить его к Apache ( см. здесь), или простое решение, которое не настолько хакерское, как сеансы экрана, заключается в использовании nohup< /а>. Если вы на самом деле реализуете это на рабочем сервере и не хотите идти по пути Apache, вы можете рассмотреть скрипт инициализации.

person stefan    schedule 11.08.2011
comment
При чем здесь Apache? Мои узлы Erlang не запускают веб-сервер. - person randombits; 12.08.2011
comment
Ах, основываясь на информации, которую вы предоставили сценарию, я предположил, что он ведет себя как веб-сервер, но я предполагаю, что он также мог просто взаимодействовать с другим веб-сервером. В этом случае apache менее полезен;) nohup по-прежнему является хорошим решением, хотя использование параметра -detached, как упоминалось иначе, вероятно, лучше. - person stefan; 12.08.2011
comment
-1. Запутанный ответ. Апач тут ни при чем, а для отсоединенной ноды erlang не нужен nohup. - person Daniel Luna; 12.08.2011