自动重启Erlang应用程序

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

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

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

现在,根据我所做的研究,看起来您可以提供其他“开始类型”:“短暂”和“永久”。

如果我在一个应用程序中启动一个Supervisor,我可以告诉它让一个特定的过程暂时或永久,并且会自动为我重新启动它。 但是,根据文档,如果我将应用程序设置为暂时的或永久的,则在应用程序死亡时不会重新启动它,而是会杀死所有其他应用程序。

我真正想要做的是以某种方式告诉Erlang虚拟机一个特定的应用程序应该始终运行,如果它停止运行,请重新启动它。 这可能吗?

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

谢谢!


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

init(_Args) ->
    {ok, {{one_for_one, 1000000, 1},
          [{ch3, {ch3, start_link, []},
            permanent, brutal_kill, worker, [ch3]}]}}.

(适用于OTP设计原则用户指南的示例。)


如果发生故障,您可以使用heart重新启动整个虚拟机,然后使用永久应用程序类型确保当您的应用程序退出时虚拟机退出。

最终,你需要在你的应用程序之上需要一些你需要信任的东西,不管它是一个主管进程,erlang虚拟机,还是你写的一些shell脚本 - 如果这种情况发生也会失败,这总是一个问题。


使用Monit,然后设置您的应用程序以通过使用监督员来终止整个应用程序,并重新启动频率合理。 如果应用程序终止,则VM终止,然后监视重新启动所有内容。

我永远无法让Heart充分可靠,因为它只会重新启动虚拟机一次,并且不能很好地处理erlang虚拟机的kill -9。

链接地址: http://www.djcxy.com/p/38227.html

上一篇: Automatically restarting Erlang applications

下一篇: Supervisor does not restart on econnrefused (thrown in init/1)