Невозможно создать суперпользователя эрланга из оболочки - PullRequest
4 голосов
/ 07 мая 2010

Я реализовал 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, новые имена / Pids не будут зарегистрированы в моем «процессе 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 ]

3 голосов
/ 07 мая 2010

Всякий раз, когда вы пытаетесь понять эти вещи, обычно очень полезно включить SASL.

Приложение:. Заводится (SASL)

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

1 голос
/ 10 мая 2010

Это объяснение было дано Бернардом Дагганом в списке рассылки вопросов Erlang :

Связанные процессы не умирают автоматически, когда процесс, с которым они связаны, завершается с кодомнормальный'.Вот почему [echo_server] не завершается при выходе из процесса порождения.Так почему руководитель умирает?Внутренние элементы модуля supervisor фактически реализованы как gen_server, но с установленным параметром process_flag (trap_exit, true).Результатом этого является то, что, когда родительский процесс умирает, вызывается terminate () (чего не происходит, когда trap_exit отключен), и супервизор выключается.Это имеет смысл в контексте супервизора, так как супервизор порождается его родителем в дереве супервизора - если он не умрет всякий раз, когда его родитель отключается, независимо от причины, у вас будут висящие «ветви» дерева.

...