自动重启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)