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

标签 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}}.

这会启动cowboy http服务器,它使用cowboy_static来服务器priv/app/目录中的一些内容,并使用当前模块来处理自定义内容(模块实现所有cowboy 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 是否在牛仔应用程序下运行?我想是的。
  • 如果是这样,我该如何阻止它?
  • 而且,我是否应该担心阻止它?也许这没什么大不了的。

提前致谢!

最佳答案

我认为这并不重要,通常每个应用程序使用一个节点/VM(实际上一堆 erlang 应用程序一起工作,但我没有更好的词)。但我认为你可以使用 application:stop(cowboy), application:stop(ranch) 停止服务器。

关于http - Erlang 停止应用程序不会结束所有进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451225/

相关文章:

linux - bash 如何终止父进程,或从 bash 模块脚本中的函数退出父进程

functional-programming - 在 Erlang 中编程时可以忽略线程安全吗?

java - Fast NIO,Java 异步 HTTP 服务器

java - 如何在爬虫中处理 cookie

android - 从 Android 应用程序启动 shell 以运行单独的可执行文件

c - fork() 之后创建的子进程的父 pid_t

database-design - Mnesia 中 set 和ordered_set 之间的区别?

functional-programming - 为什么有一个函数未定义的消息,而它是关于变量的

javascript - Observable 已订阅,响应已返回,无法访问字段

python - Django StreamingHttpResponse 格式错误