Erlang上的牛仔在关机时崩溃

时间:2015-01-06 21:22:24

标签: erlang supervisor cowboy lager

我在关闭与我的牛仔处理程序相关的Erlang vm时遇到了很多错误。我有一个simple_one_for_one主管运行一个运行cowboy的start_listeners()函数:start_http()。

一切都开始,没有错误,正常处理请求。

如果我关闭了erlang VM,我得到:

[错误]主管bitter_rpc_sup让孩子bitter_rpc_http_id以bitter_rpc_sup:start_listeners()在未定义的出口处启动,原因在上下文中被杀死shutdown_error

还有一些与牛仔进程相关的其他错误被杀死并异常终止。牛仔不遵循OTP惯例关闭吗?有没有办法拦截主管的关机并手动关闭所有的牛仔进程/牧场池?

我应该在哪里尝试压制此错误?

2 个答案:

答案 0 :(得分:1)

您可以创建牧场孩子并将其添加到您的主管:

init([]) ->
    %% define Ref, NbAcceptors, IP, Port, Dispatch
    ...
    WebChild = ranch:child_spec(Ref,
                                NbAcceptors,
                                ranch_tcp,
                                [{ip, IP}, {port, Port}],
                                cowboy_protocol,
                                [{env, [{dispatch, Dispatch}]}]),
    {ok, {{one_for_one, 10, 10}, [WebChild]}}.

答案 1 :(得分:0)

仔细查看所包含的牛仔示例,http服务器不是直接监督,而是在Cowboy应用程序下运行。

所以我改变了我的rpc守护进程的主管什么都不做:

init([]) ->
    Procs = [],
    {ok, {{one_for_one, 10, 10}, Procs}}.

并在主进程中实例化牛仔调度程序,从开始返回空主管(