Проблема с запуском супервизора через скрипт - Erlang - PullRequest
4 голосов
/ 30 мая 2011

Я сделал OTP-совместимое приложение, где у меня есть gen_server и супервизор.Также у меня есть скрипт для их запуска.

Мой скрипт содержит что-то вроде этого.erl -pa имя_модуля / ebin -name abc @ hostname -setcookie test -s module_sup start_link ()

Это не запускает супервизор.Но когда я делаю module_sup: start_link () внутри оболочки, это работает.

Также, когда я делаю erl -pa имя_модуля / ebin -name abc @ hostname -setcookie test -s module_srv start_link (), т.е. только сервербез супервизора сервер запускается.

Итак, что я тут не так делаю.Разве нам не разрешено запускать супервайзера таким образом?

Любая помощь будет чрезвычайно ценной.

Спасибо, Уилсон

Ответы [ 3 ]

5 голосов
/ 30 мая 2011

supervisor:start_link/2 создает ссылку на свой вызывающий процесс. когда этот вызывающий процесс завершается, супервизор с ним забирается.

erl -s module_sup start_link запускает супервизор, но он убит, потому что ваша функция запуска запускается в своем собственном процессе, который умирает после выхода из функции.

вы можете наблюдать подобное поведение с spawn(module_sup, start_link, [])., когда супервизор запускается и немедленно убивается. когда вы вручную запускаете супервизор, вызывающим процессом является оболочка. когда оболочка завершается, она убивает супервизора.

Обычно супервизор верхнего уровня запускается приложением.

0 голосов
/ 20 октября 2011

Важно отметить, что процесс умирает только в том случае, если связанный процесс завершается по причине, отличной от «нормальной», что означает, что процесс, который просто завершает свое выполнение, не уничтожает связанные с ним процессы.(источник http://www.erlang.org/doc/reference_manual/processes.html#id204170) Я думаю, что это важный аспект Erlang, который не следует неправильно истолковывать.

Следующий исходный код показывает это:

1> spawn(
1>   fun() ->
1>      io:format("outer ~p~n", [self()]),
1>      spawn_link(
1>         fun () ->
1>            io:format("inner ~p~n", [self()]),
1>            receive
1>               Msg -> io:format("received ~p~n", [Msg])
1>            end
1>         end)
1>   end).
outer <0.37.0>
<0.37.0>
inner <0.38.0>
2> is_process_alive(pid(0,37,0)).
false
3> pid(0,38,0) ! test.
received test
test
4>

Вы можете видеть, чтовызывающая сторона <0.37.0> не запущена, но процесс <0.38.0> все еще находится там, ожидая сообщения.

В любом случае супервизор не прекратит работу , когда вызывающая сторона завершит работупоскольку диспетчер перехватывает сигналы выхода. Конечно, если он не запрограммирован на это. Но я изучил исходный код и не смог его найти, но, увы, мой анализ мог быть слишком поверхностным.

У вас естьмне повезло с этим? Я попробую запустить несколько тестов и посмотреть, смогу ли я выяснить, что происходит.

0 голосов
/ 30 мая 2011

Это очень похоже на Как запустить приложения из командной строки в качестве демона? Короче говоря, вы не можете использовать -s для запуска супервизора, если не используете unlink/1, то есть всего ляп. Ваше время лучше потратить на изучение того, как упаковать ваш код как приложение . Я бы рекомендовал сделать это с арматурой .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...