【问题标题】:Is it possible to automatically restart killed erlang applications?是否可以自动重启被杀死的 erlang 应用程序?
【发布时间】:2017-02-01 10:00:09
【问题描述】:

我有一个应用程序,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 没有被杀死,也没有被通知(我可以找到)

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

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

谢谢!

【问题讨论】:

    标签: erlang erlang-otp


    【解决方案1】:

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

    application:start(some_dep1, permanent)
    

    application:ensure_all_started(my_app, permanent)
    

    应用程序没有类似主管的东西:如果一个应用程序崩溃,则意味着它的顶级主管已经崩溃,这表明应用程序不知道它还能做些什么来纠正问题。 (如果重新启动应用程序可以解决问题,那么同样可以通过增加顶级主管中的重新启动限制来解决。)“监督”的下一个级别是heart,如果它重新启动一个 Erlang 节点崩溃。

    【讨论】:

    • 好的,这让我稍微舒服一些——我们让 AWS 在我们的 erlang 节点中监视一些状态发射器;因此,如果整个节点发生故障,AWS 将替换它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多