自动重启Erlang应用程序

Nic*_*ick 5 erlang erlang-supervisor

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

=INFO REPORT==== 11-Jun-2010::11:07:25 ===
     application: myapp
     exited: shutdown
     type: temporary
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

谢谢!

leg*_*cia 5

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

初始化(_Args)->
    {ok, {{one_for_one, 1000000, 1},
          [{ch3, {ch3, start_link, []},
            永久的,残酷的杀戮,工人,[ch3]}]}}。

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


Gre*_*ers 5

如果VM关闭,您可以使用heart重新启动整个VM,然后使用永久应用程序类型确保在应用程序退出时VM退出.

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