【问题标题】:Automatically restarting Erlang applications自动重启 Erlang 应用程序
【发布时间】:2011-03-04 12:51:12
【问题描述】:

我最近遇到了一个错误,整个 Erlang 应用程序都死了,产生了如下所示的日志消息:

=INFO REPORT==== 11-Jun-2010::11:07:25 ===
     application: myapp
     exited: shutdown
     type: temporary

我不知道是什么触发了这次关闭,但我遇到的真正问题是它没有自行重启。相反,现在空无一物的 Erlang VM 只是坐在那里无所事事。

现在,根据我所做的研究,您可以为应用程序提供其他“启动类型”:“瞬态”和“永久”。

如果我在应用程序启动一个主管,我可以告诉它使一个特定进程暂时或永久,它会自动为我重新启动它。但是,根据文档,如果我将 application 设为临时或永久,它不会在它死亡时重新启动它,而是会杀死 所有其他 应用程序.

我真正想做的是以某种方式告诉 Erlang VM 一个特定的应用程序应该始终运行,如果它出现故障,请重新启动它。这可以吗?

(我不是在谈论在我的应用程序之上实现主管,因为这是一个问题 22:如果我的主管进程崩溃了怎么办?我正在寻找某种 API 或我可以使用的设置Erlang 监视并为我重新启动我的应用程序。)

谢谢!

【问题讨论】:

    标签: erlang erlang-supervisor


    【解决方案1】:

    您应该能够在顶级主管中解决此问题:将重启策略设置为每秒允许一百万次重启,并且应用程序永远不会崩溃。比如:

    init(_Args) ->
        {好吧,{{one_for_one, 1000000, 1},
              [{ch3, {ch3, start_link, []},
                永久,野蛮杀戮,工人,[ch3]}]}}。

    (示例改编自OTP Design Principles User Guide。)

    【讨论】:

    • 太好了,非常感谢您的回答。我现在看到它死亡的原因确实是因为达到了最大重启限制。不过,我不一定只想禁用它,因为如果它实际上进入了重启循环,那么我们可能需要重启整个应用程序。如果达到 AllowedRestarts/MaxSeconds 限制,有没有办法让它重新启动应用程序,而不是关闭应用程序?
    • 在您描述的情况下,您将为您的主管添加一个主管。 OTP 使用的行为是,当一个退出信号被发送到对应用程序进行启动调用的进程时(即当顶级主管死亡时),它假定应用程序无法修复错误,它将关闭应用程序并且可能的节点取决于配置。我想关键是你的应用程序不应该崩溃,如果他们这样做,错误就足够严重,只能通过节点重启来解决。
    • @jisaacstone 修复了链接。显然www.erlang.org需要改为erlang.org
    • 我不同意这个答案,因为它扭曲了重启限制的意图。这应该是尝试成功重新启动应用程序的最大自动重试次数,如果无法自行重试,则应该进行人工干预以帮助应用程序重新启动。对自动重试设置如此高的限制只会浪费许多连续的应用程序重新启动的时间。更完整的解决方案是让整个节点崩溃,让 Erlang 之外的另一个工具(比如 inaka 和 GregRogers 说的)自动重启节点。 (下面继续)
    • 后续如果连外部工具都无法成功重启Erlang节点,则需要人工干预。
    【解决方案2】:

    您可以使用heart 在整个 VM 出现故障时重新启动它,然后使用永久应用程序类型来确保 VM 在您的应用程序退出时退出。

    最终,您需要在您的应用程序之上有一些您需要信任的东西,无论是主管进程、erlang 虚拟机还是您编写的一些 shell 脚本 - 如果这也发生故障,这将始终是一个问题。

    【讨论】:

    • 好的,谢谢。在这种情况下,这种解决方案对我来说很好。但是,如果我想一次运行多个应用程序,并让它们根据需要独立重启,该怎么办?有了 Erlang 包含的所有花哨的进程监督功能,我发现我似乎无法做一些简单的事情,比如在应用程序出现故障时重新启动它......
    【解决方案3】:

    使用 Monit,然后设置您的应用程序以通过对整个应用程序使用合理的重启频率来终止。如果应用程序终止,VM 也会终止,monit 会重新启动一切。

    我永远无法让 Heart 足够可靠,因为它只重新启动 VM 一次,而且它不能很好地处理 erlang VM 的 kill -9。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2011-09-15
      • 2011-12-04
      • 2013-04-24
      相关资源
      最近更新 更多