自动重启Erlang应用程序

时间:2010-06-16 15:18:46

标签: erlang supervisor

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

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

我不知道是什么触发了此关闭,但我遇到的真正问题是它没有重启。相反,现在空的Erlang VM只是坐在那里什么都不做。

现在,根据我所做的研究,看起来还有其他“开始类型”你可以给出一个应用程序:'transient'和'permanent'。

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:5)

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

最终,您需要在您的应用程序之上需要信任的东西,无论是管理程序进程,erlang VM还是您编写的某些shell脚本 - 如果发生故障也会一直存在问题。

答案 1 :(得分:4)

您应该能够在顶级主管中修复此问题:将重启策略设置为每秒允许重启一百万次,应用程序永远不会崩溃。类似的东西:

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

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

答案 2 :(得分:4)

使用Monit,然后使用主管以适当的重启频率为整个应用程序设置应用程序以终止。如果应用程序终止,则VM终止,monit重新启动所有内容。

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