Не может вызвать руководитель Erlang от оболочки

StackOverflow https://stackoverflow.com/questions/2785692

  •  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).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top