【问题标题】:Problem with starting supervisor through script - Erlang通过脚本启动主管的问题 - Erlang
【发布时间】:2011-09-04 16:03:31
【问题描述】:

我已经制作了一个符合 OTP 的应用程序,其中我有一个 gen_server 和一个主管。我也有一个脚本来启动它们。

我的脚本包含类似这样的内容。 erl -pa module_name/ebin -name abc@hostname -setcookie test -s module_sup start_link()

这不会启动主管。但是当我在 shell 中执行 module_sup:start_link() 时,它可以工作。

当我这样做的时候 erl -pa module_name/ebin -name abc@hostname -setcookie test -s module_srv start_link() 即服务器单独没有主管,服务器启动。

那么,我在这里做错了什么。不可以这样启动supervisor吗?

任何帮助都将受到高度评价。

谢谢, 威尔逊

【问题讨论】:

    标签: erlang


    【解决方案1】:

    重要的是要注意一个进程只有在链接的进程以非“正常”的原因终止时才会终止,这意味着一个简单地完成其执行的进程不会终止与其链接的进程。 (来源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>
    

    可以看到调用者没有运行,但是进程还在,等待消息。

    无论如何,当调用者终止时,监督者不会终止,因为监督者捕获了退出信号。当然,除非它被编程为这样做。但是我查看了源代码并没有找到,唉,我的分析可能太肤浅了。

    你有运气吗?我会尝试运行一些测试,看看我是否能弄清楚发生了什么。

    【讨论】:

      【解决方案2】:

      这与How do I start applications by command line as a daemon? 非常相似,简而言之,除非使用unlink/1,否则您不能使用-s 来启动主管,这完全是杂牌。您最好花时间学习如何将代码打包为application。我建议使用rebar 进行此操作。

      【讨论】:

        【解决方案3】:

        supervisor:start_link/2 创建一个指向其调用进程的链接。当该调用进程退出时,主管将随之取消。

        erl -s module_sup start_link 正在启动主管,但它被杀死了,因为你的启动函数在它自己的进程中运行,一旦函数退出,它就会死掉。

        您可以使用spawn(module_sup, start_link, []). 观察到类似的行为,主管启动并立即被杀死。当你手动启动supervisor时,调用进程是shell。当 shell 退出时,它会杀死主管。

        通常,顶级主管是由应用程序启动的。

        【讨论】:

        • 感谢您的回复。现在我明白了这个问题。将尝试使用应用程序行为,并再次感谢 :-)
        猜你喜欢
        • 2011-06-18
        • 1970-01-01
        • 2021-03-18
        • 2011-05-24
        • 2012-10-01
        • 2012-04-03
        • 2016-08-16
        • 2017-04-07
        • 2015-11-04
        相关资源
        最近更新 更多