Erlang主管终止行为

时间:2014-04-18 17:06:08

标签: erlang terminate supervisor

我有一个不寻常的情况,一个启动2个顶级主管的应用程序,例如,

...
-behavior(application).
...
start(_StartType, _StartArgs) ->
    sup1:start_link(),
    sup2:start_link().

他们都有{one_for_one, 0, 1}重启策略。他们的孩子实现了一个简单的crash函数,它会抛出bad_match错误。

对于我的问题,如果我致电sup1_child1:crash()主管sup1将终止,但申请将继续运行(即主管sup2及其子女仍然可用)。如果我调用sup2_child1:crash(),则整个应用程序终止。在后两种情况下,后者的行为都是我所期望的。如果我翻转start_link()来电的顺序,即

...
    sup2:start_link(),
    sup1:start_link().

然后崩溃sup1将导致应用程序终止,但崩溃sup2将不会。因此,调用start_link()的顺序似乎确定哪个主管崩溃将导致应用程序终止。这是预期的吗?或者我是否通过拥有两名根管理员来滥用监督树的能力?

谢谢,

1 个答案:

答案 0 :(得分:1)

完全可以预料到,因为你正在滥用监督树功能。有一个名为“应用程序主管”的隐藏主管"。您的应用程序:启动函数应该返回一个由应用程序主管监视的SINGLE pid。如果该进程崩溃,BEAM VM也将崩溃(实际上,取决于应用程序的启动方式;类似于工作进程,您的应用程序可以是永久性的或瞬态的(甚至可能是临时的))。

您应该有一名顶级主管(您的应用程序主管)。如果您需要顶级的两名主管,他们都应该是您的应用程序主管的孩子。