自动重新启动Erlang应用程序

自动重新启动Erlang应用程序,erlang,erlang-supervisor,Erlang,Erlang Supervisor,我最近遇到了一个bug,整个Erlang应用程序都死掉了,生成了一条如下的日志消息: =INFO REPORT==== 11-Jun-2010::11:07:25 === application: myapp exited: shutdown type: temporary 我不知道是什么触发了这次关机,但真正的问题是它没有自动重启。相反,现在空无一人的ErlangVM只是坐在那里无所事事 现在,从我所做的研究来看,您可以为应用程序提供其他“启动类型”:“瞬态”和

我最近遇到了一个bug,整个Erlang应用程序都死掉了,生成了一条如下的日志消息:

=INFO REPORT==== 11-Jun-2010::11:07:25 ===
     application: myapp
     exited: shutdown
     type: temporary
我不知道是什么触发了这次关机,但真正的问题是它没有自动重启。相反,现在空无一人的ErlangVM只是坐在那里无所事事

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

如果我在应用程序中启动一个主管,我可以告诉它使某个特定的进程暂时或永久,它会自动为我重新启动它。然而,根据文档,如果我让一个应用程序暂时或永久,它不会在死机时重新启动,而是会杀死所有其他应用程序

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

(我不是说在我的应用程序上实现一个管理器,因为这是一个第22条陷阱:如果我的管理器进程崩溃了怎么办?我在寻找某种API或设置,可以用来让Erlang监视并重新启动我的应用程序。)


谢谢

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

init(_Args) -> {ok, {{one_for_one, 1000000, 1}, [{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}]}}. 初始化(_Args)-> {好的,{一对一,1000000,1}, [{ch3,{ch3,启动链接,[]}, 永久的,残暴的,工人,[ch3]}}。 (示例改编自。)

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


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

使用Monit,然后设置应用程序,使其以合理的重新启动频率终止整个应用程序。如果应用程序终止,虚拟机将终止,monit将重新启动所有内容


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

太好了,非常感谢您的回答。我现在明白了,它死亡的原因确实是因为达到了最大重启限制。我不一定要禁用它,因为如果它真的进入重启循环,那么我们可能需要重启整个应用程序。如果达到AllowedRestarts/MaxSeconds限制,有没有办法让它重新启动应用程序,而不是关闭应用程序?在您描述的情况下,您会向您的主管添加一名主管。OTP使用的行为是,当向对应用程序执行启动调用的进程发送退出信号时(即,当顶级主管死亡时),它假定应用程序无法修复错误,并将根据配置关闭应用程序和可能的节点。我想关键是你的应用程序不应该崩溃,如果它们崩溃了,那么错误就严重到只能通过重新启动节点来解决。@jisaacstone修复了链接。显然,
www.erlang.org
需要更改为
erlang.org
。我不同意这个答案,因为它扭曲了重启限制的意图。这应该是尝试成功重新启动应用程序的最大自动重试次数,如果无法自行重试,则应进行手动干预以帮助应用程序重新启动。对自动重试设置如此高的限制只会在多次连续重新启动应用程序时浪费时间。一个更完整的解决方案是允许整个节点崩溃,并让Erlang之外的另一个工具(如inaka和GregRogers所说)自动重新启动节点。(下面继续)随后,如果外部工具都无法成功重新启动Erlang节点,则需要人工干预。好的,谢谢。在这种情况下,那种解决办法对我来说很好。但是,如果我想一次运行多个应用程序,并让它们根据需要独立重新启动,该怎么办?Erlang包含了所有花哨的过程监控功能,我发现我似乎不能做一些简单的事情,比如在应用程序停机时重新启动应用程序,这让我感到惊讶。。。。