是否可以自动重启已杀死的erlang应用程序?

时间:2016-09-23 13:51:33

标签: erlang otp

我有一个应用程序my_app。它有一些它依赖的其他应用程序。

my_app.app:

{application, my_app,
 [ {description, "My App"},
   {vsn, "0.0.1"},
   {registered, []},
   {applications, [some_dep1,
                   some_dep2]},
   {mod, {my_app_app, []}},
   {env, []}
 ]}.

如果some_dep1some_dep2无法启动,my_app也将无法启动。到目前为止,非常好。

但是,如果在运行系统期间出现问题并且some_dep1爆炸(在树上一直取出主管),erlang最终会终止some_dep1应用程序;但是my_app没有被杀死,也没有得到通知(我能找到)

有办法解决这个问题吗?理想情况下,我希望它重新启动(就像主管处理重启,阈值等),或者杀死任何依赖它的应用程序。

我目前的想法是轮询应用程序状态,但这似乎是一个巨大的黑客攻击。

谢谢!

1 个答案:

答案 0 :(得分:6)

如果应用程序作为“永久”应用程序启动,则如果应用程序崩溃,整个Erlang节点将关闭。这是生成版本时的默认设置,但如果您使用的是application:startapplication:ensure_all_started,则默认类型为temporary,这意味着应用程序只是默默地死亡,就像您一样观测到的。尝试类似:

application:start(some_dep1, permanent)

application:ensure_all_started(my_app, permanent)

对于应用程序没有类似管理程序的东西:如果应用程序崩溃,则意味着其顶级管理程序崩溃,表明应用程序不知道它还可以做些什么来纠正问题。 (如果重新启动应用程序可以解决问题,可以通过增加顶级管理程序中的重新启动限制来修复它。)下一级“监督”是heart,它会重新启动Erlang节点如果它崩溃了。