Запуск оболочки erlang в качестве демона / службы - PullRequest
4 голосов
/ 26 июля 2011

У меня есть программа Erlang, которая работает в оболочке Erlang, и я хочу ее контролировать.

Вот что я хочу:

  • Когда машина запускается, оболочка Erlang должна запускаться вместе с ней, а также программа, которая запускается в оболочке.
  • Если оболочка Erlang по какой-либо причине дает сбой, она должна быть перезапущена.
  • Вы должны иметь возможность вручную запускать / останавливать / перезапускать оболочку Erlang.

Пример:

/etc/init.d/foobar start
/etc/init.d/foobar stop
/etc/init.d/foobar restart

Я еще не начал с цели "перезагрузить сам, если сбой", застрял с легкой вещью, или это просто?

Что я сделал, так это:

Взял код скелета из /etc/init.d/skeleton и заменил PATH, DESC, NAME и т. Д. И т. Д ... Это работает, я могу сделать:

/etc/init.d/foobar start

Однако я не могу это остановить ... Дело в том, что я запускаю оболочку Erlang с помощью "erl", который представляет собой скрипт, который делает некоторые причудливые вещи, которые я не понимаю. Он создает очень длинное и сложное имя процесса. Это не просто "эрл", это как:

/ usr / lib / erlang / erts-5.7.4 / bin / beam.smp - -root / usr / lib / erlang -progname erl - -home / home / xxx - .... и некоторые другие больше.

Есть ли лучший способ сделать это?

ОС: Ubuntu 11.04

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Что вы хотите сделать, это создать целевую систему.Документация для этого находится здесь: http://www.erlang.org/doc/system_principles/create_target.html Однако сначала это немного сложно, пока вы не получите базовые понятия.

Грубо говоря, вы делаете следующее:

  1. Создать пустой узел.То есть каталоги bin, erts и Releases (с обновленными сценариями в bin).
  2. Создайте релиз с помощью release_tools, как описано в dox.
  3. Распакуйте релиз на пустом узлеустановите файл release / start_erl.data так, чтобы он указывал на новый выпуск и версии erts.

Это можно затем использовать как службу с перезапусками / мониторами и всем, что вы хотите добавить.

2 голосов
/ 27 июня 2012

Недавно выпущенный проект erld - отличный способ по-настоящему демонизировать приложение Erlang. Он обеспечивает поддержку всего, что должен делать демон, а именно:

  • Может быть запущен / остановлен из сценария инициализации
  • При запуске управление не возвращается к консоли, пока программа не запустилась успешно (или не смогла это сделать).
  • Диагностическая информация при запуске может выводиться на консоль для индикации хода выполнения, но вывод прекращается после запуска демона.
  • При возврате на консоль код возврата указывает на успех (0) или сбой (какой-то другой номер).
  • Вращение журнала может быть вызвано отправкой SIGHUP

См. Их страницу github здесь: https://github.com/ShoreTel-Inc/erld

2 голосов
/ 26 июля 2011

В дополнение к созданию целевой версии, стандартной производственной среды Erlang, рекомендованной @Martin, вам необходимо следующее:

  • Чтобы разрешить автоматический перезапуск аварийного узла, вы должны использовать функциональность сердца .

  • Чтобы остановить работающий узел Erlang, вы можете запустить временный узел Erlang, подключиться к работающему узлу и выполнить команду остановки:

    erl -noshell -sname temp_control \
        -eval "rpc:call(mynode@myhost, init, stop, [])" \
        -s init stop
    
    • noshell отключает ввод и вывод оболочки
    • sname устанавливает имя для временного узла
    • eval давайте выполним любое допустимое выражение Erlang
      • rpc:call(Node, M, F, A) вызовет M:F(A) на указанном узле (A - список аргументов, которые будут переданы функции в качестве реальных аргументов)
    • s M F запускает функцию M:F()

    (eval и s выполняются последовательно)

...