我有一个应用程序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_dep1
或some_dep2
无法启动,my_app
也将无法启动。到目前为止,非常好。
但是,如果在运行系统期间出现问题并且some_dep1
爆炸(在树上一直取出主管),erlang最终会终止some_dep1
应用程序;但是my_app没有被杀死,也没有得到通知(我能找到)
有办法解决这个问题吗?理想情况下,我希望它重新启动(就像主管处理重启,阈值等),或者杀死任何依赖它的应用程序。
我目前的想法是轮询应用程序状态,但这似乎是一个巨大的黑客攻击。
谢谢!
答案 0 :(得分:6)
如果应用程序作为“永久”应用程序启动,则如果应用程序崩溃,整个Erlang节点将关闭。这是生成版本时的默认设置,但如果您使用的是application:start
或application:ensure_all_started
,则默认类型为temporary
,这意味着应用程序只是默默地死亡,就像您一样观测到的。尝试类似:
application:start(some_dep1, permanent)
或
application:ensure_all_started(my_app, permanent)
对于应用程序没有类似管理程序的东西:如果应用程序崩溃,则意味着其顶级管理程序崩溃,表明应用程序不知道它还可以做些什么来纠正问题。 (如果重新启动应用程序可以解决问题,可以通过增加顶级管理程序中的重新启动限制来修复它。)下一级“监督”是heart,它会重新启动Erlang节点如果它崩溃了。