Не может вызвать руководитель Erlang от оболочки
-
03-10-2019 - |
Вопрос
Я реализовал Gen_Server и Supervisor: test_server
а также test_sup
. Отказ Я хочу проверить их из оболочки / CLI. Я написал их start_link
Функции такие, что их имена зарегистрированы локально.
Я обнаружил, что я могу порождать test_server
из командной строки просто отлично, но порождено test_sup
Не позволяет мне вообще взаимодействовать с сервером.
Например, я могу вызвать test_server
выполняя:
1> spawn(test_server, start_link, []).
<0.39.0>
2> registered().
[...,test_server,...]
Я могу взаимодействовать с сервером, и все выглядит нормально.
Тем не менее, если я стараюсь сделать то же самое с test_sup
, Новые имена / PID не зарегистрированы в моем «процессе CLI» (используя registered/0
). Мой test_server
Похоже, было порождено, но я не могу с этим взаимодействовать (см. комментарий Лукас Ларссон о SASL, чтобы понять, почему это правда).
Я бы предположил, что я закодировал ошибку в моем руководителя, но этот метод запуска моего руководителя отлично работает:
1> {ok, Pid}= test_sup:start_link([]).
{ok, <0.39.0>}
2> unlink(Pid).
true
3> registered().
[...,test_server,test_sup,...]
Почему я могу вызвать Gen_Server, но не руководителем?
Обновлять
Код, который я использую, можно найти в эта почта. Отказ я использую echo_server
а также echo_sup
, два очень простых модуля.
Учитывая этот код, это работает:
spawn(echo_server, start_link, []).
И это не так:
spawn(echo_sup, start_link, []).
Решение 2
Это объяснение было дано Бернард Дугган на Erlang вопросы рассылки рассылки:
Связанные процессы не умирают автоматически, когда процесс, который они связаны с выходами с кодом «нормально». Вот почему [echo_server] не выходит, когда выходит процесс нереста. Так почему же умереть над руководителем? Интернеты модуля супервизора на самом деле сами реализованы как Gen_Server, но с помощью Process_Flag (Trap_exit, True). Результатом этого является то, что когда родительский процесс умирает, заканчивается () вызывается (что не происходит, когда Trap_exit отключен), и руководитель отключается. Это имеет смысл в контексте руководителя, поскольку руководитель породил его родителем на дереве надзора - если он не умирал всякий раз, когда его родительское отключение, независимо от причины, у вас есть свисающие «ветви» дерева.
Другие советы
Всякий раз, когда пытаясь понять эти вещи, это обычно очень полезно включать SASL.
Применение: запуск (SASL).
Таким образом, вы надеетесь узнать, почему вы руководителя прекращаются.