【问题标题】:How to stop third-party Erlang applications如何停止第三方 Erlang 应用程序
【发布时间】:2011-01-19 07:35:14
【问题描述】:

我正在编写我的第一个 erlang 应用程序,但我还不了解 erlang 生态系统的某些部分以及应该如何在其中完成工作。例如,如果我的应用程序依赖于其他一些应用程序,那么立即和停止它们的方法是什么?其实我已经想好怎么下手了,只要把application:start/1调用放到应用模块的start/2函数里面:

-module(myapp).
-behaviour(application).

-export([start/0, start/2, stop/1]).

start(_Type, _StartArgs) ->
    ok = application:start(ssl),
    ok = application:start(inets),
    ok = application:start(log4erl),
    myapp_sup:start_link().

stop(_State) ->
    ok.

但是当我尝试将相应的application:stop/1 调用放入myapp:stop/1 函数并从erlang shell application:stop(myapp) 调用时,后者只是停止响应任何命令。

【问题讨论】:

  • 只需停止 stop 函数中的其他应用程序。正如罗伯托所说,您自己的应用程序被平台停止。
  • ...并希望没有其他正在运行的应用程序依赖于停止的应用程序。

标签: erlang


【解决方案1】:

你已经得到了一些很好的建议。让我对您看到的问题添加一个解释:您的 stop 回调函数由应用程序控制器同步调用,即应用程序控制器在您的函数返回之前不会做任何其他事情。但是您要求应用程序控制器停止其他一些应用程序——这两个进程处于死锁状态,相互等待。

【讨论】:

    【解决方案2】:

    我建议查看 erlware.org 并使用 sinan 和faxien 工具来进行 Erlang 开发。如果您对您的应用程序和发布坚持严格的 OTP 合规性,它不仅可以使开发更容易、更不容易出错,而且可以更轻松地共享您的应用程序。即将出版的书 http://www.manning.com/logan/ 回答更多,您可以阅读 pdf 格式的早期副本。

    在模块中“随机”启动和停止是一个坏主意。

    【讨论】:

    • "sinan" 和 "faxien" 似乎不再存在。谷歌把我带到死去的 GitHub 页面。
    【解决方案3】:

    阅读官方文档:

    stop/1 在应用程序之后被调用 已经停止,应该做任何 必要的清理。请注意, 应用程序的实际停止, 那是关闭 监督树,被处理 自动按照Starting and Stopping Applications 中的说明进行。

    更多信息here和there。

    通常,当我有一些依赖应用程序时,我会使用 .app 资源文件,其中列出了需要由我的应用程序启动(或加载)才能正常工作的所有应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多