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

Seb*_*Seb 4 erlang 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, []}
 ]}.
Run Code Online (Sandbox Code Playgroud)

如果其中一个some_dep1some_dep2未能启动,my_app也将无法启动.到现在为止还挺好.

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

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

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

谢谢!

leg*_*cia 6

如果应用程序作为"永久"应用程序启动,则如果应用程序崩溃,整个Erlang节点将关闭.这是生成发布时的默认设置,但如果您正在使用application:startapplication:ensure_all_started,则默认类型为temporary,这意味着应用程序只是默默地死亡,正如您所观察到的那样.尝试类似的东西:

application:start(some_dep1, permanent)
Run Code Online (Sandbox Code Playgroud)

要么

application:ensure_all_started(my_app, permanent)
Run Code Online (Sandbox Code Playgroud)

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