5

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

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

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

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

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

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

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

谢谢!

4

3 回答 3

5

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

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

(示例改编自OTP 设计原则用户指南。)

于 2010-06-16T16:51:18.867 回答
5

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

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

于 2010-06-16T18:57:14.903 回答
4

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

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

于 2010-06-17T13:33:07.727 回答