Erlang停止应用程序不会结束所有进程?

时间:2014-08-22 16:05:52

标签: http process erlang httpserver cowboy

当我停止构建的Erlang应用程序时,牛仔监听器进程保持活动状态,继续处理请求。在我写的gen_server中,我在init上启动了一个服务器。如下所示:

init([Port]) ->
    Dispatch = cowboy_router:compile([
        {'_', [
                    {"/custom/[...]", ?MODULE, []},
                    % Serve index.html as default file
                    % Serve entire directory
                    {"/[...]", cowboy_static, {priv_dir,
                                               app, "www"}}
              ]}
        ]),
    Name = custom_name,
    {ok, Pid} = cowboy:start_http(Name, 100,
                  [{port, Port}],
                   [{env, [{dispatch, Dispatch}]}]),
    {ok, #state{handler_pid = Pid}}.

这启动了牛仔http服务器,它使用cowboy_static来服务priv/app/目录中的一些东西以及当前模块来处理自定义内容(模块实现所有牛仔http句柄回调)。它从调用返回pid并将其分配给状态记录中的handler_pid。这一切都有效。但是,当我启动包含此模块的应用程序(工作)然后我停止它。所有流程结束(至少是我的应用程序中的流程)。自定义处理程序(与gen_server在同一模块中实现)不再有效。但是cowboy_static句柄继续处理请求。它继续提供静态文件,直到我杀死节点。我尝试通过将其添加到gen_server来解决这个问题:

terminate(_Reason, State) ->
    exit(State#state.handler_pid, normal),
    cowboy:stop_listener(listener_name()),
    ok.

但没有任何改变。 cowboy_static处理程序继续提供静态文件。

问题:

  • 我在这里做错了吗?
  • cowboy_static是否在牛仔应用程序下运行?我认为是。
  • 如果是这样,我该如何阻止它?
  • 而且,我应该关注它吗?也许这不是什么大不了的事。

提前致谢!

2 个答案:

答案 0 :(得分:3)

我不认为它非常重要,通常每个应用程序使用一个节点/ VM(实际上是一堆erlang应用程序一起工作,但我没有更好的词)。但我认为您可以使用application:stop(cowboy), application:stop(ranch).

停止服务器

答案 1 :(得分:0)

你应该解决3件事:

  • start_http(Name, ...)stop_listener(Name)中的符号应匹配。
  • 陷阱退出服务初始化:process_flag(trap_exit, true)
  • 从终止中删除exit来电。