【问题标题】:Erlang/OTP, how to signal an application startup error without a crashErlang/OTP,如何在不崩溃的情况下发出应用程序启动错误信号
【发布时间】:2012-05-30 07:23:01
【问题描述】:

所以我有这个应用程序,它有一个进程,需要一些 gen_servers 在集群的其他地方处于活动状态。
如果它们启动了,它就可以工作,如果没有,我的 gen_server 在初始化中失败,{error,Reason},这会通过我的主管传播到我的应用程序 start 函数中。
问题是,如果我返回 {ok,Pid} 以外的任何内容,我会收到崩溃报告。

我的意图是以某种方式表明应用程序无法正常启动并且所有进程都已关闭,因此不应将应用程序视为处于活动状态,但是,我只能选择返回 {ok, self ()} 并查看我的应用程序是否列为active,或者返回 {error, Error} 并查看它是如何崩溃的:

{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}},{ancestors,[rtb_sup,<0.134.0>]},
{messages,[]},{links,[<0.135.0>]},{dictionary,[]},{trap_exit,false},{status,running},
{heap_size,377},{stack_size,24},{reductions,255}],[]]:\n"

问题似乎比这个更大,基本上没有办法告诉应用程序框架应用程序失败了。它可能看起来像是由 erlang 中的 let the process die 处理的这些事情之一,但在 application:start 上允许 {error, } 返回值似乎是一个很好的权衡。

有什么提示吗?

【问题讨论】:

  • 只是好奇:无法启动(崩溃)的应用程序和启动但无法执行任何操作的应用程序之间有什么区别(对于实际问题)?您是否会对已启动(但失败)的应用程序执行任何操作,例如在这些 gen_servers 启动然后继续执行时进行轮询?你的应用程序无法启动而不是让它在启动时崩溃的“信号”有什么意义?也许您想启动您的应用程序,但等待这些 gen_servers 启动后的事件,以便您可以继续执行
  • 最好让应用程序崩溃,使其处于某种奇怪的状态
  • 我同意。对启动其他 gen_server 的应用程序创建依赖可能会更好,因此一切都以正确的顺序启动
  • Mod:start/2 函数不能在启动树之前先检查必要的服务器是否正在运行,如果没有则返回 {error,Reason}。这意味着将智能移出应用程序服务器,这可能是一件坏事。
  • @marcelog 如果应用程序已启动但无法执行任何操作(因为进程不存在),它仍会显示在 application:which_applications() 中,我在管理层经常使用它来检查对于已启动的应用程序。如果应用程序无法启动,我可以随时将其登录到我的管理层并明显显示它没有启动。

标签: crash erlang erlang-otp


【解决方案1】:

应用程序随时会崩溃,因此应用程序在启动时的依赖关系无法提供有用的动态崩溃信息。

之前我看过rabbitmq项目源码的一部分,它也是一个基于集群的程序。

我认为rabbitmq 遇到了您所说的类似问题,因为集群需要收集相关的nodes's 应用程序“正在运行”信息和memory water highmark information 然后做出决定。

解决办法是

  1. 在本地注册节点中应用的第一个主进程,在rabbitmq系统中名为“rabbit”,可以找到rabbit.erl文件,在函数“start/2”中。

    start(normal, []) -> case erts_version_check() of ok -> {ok, SupPid} = rabbit_sup:start_link(), true = register(rabbit, self()), print_banner(), [ok = run_boot_step(Step) || Step <- boot_steps()], io:format("~nbroker running~n"), {ok, SupPid}; Error -> Error end.

  2. 另外4个模块rabbit_node_monitor.erl, rabbit_memory_monitor.erl, vm_memory_monitor.erl, rabbit_alarm.erl使用了两种erlang技术,一个是监听进程获取注册进程的“DOWN”消息,另一个是告警处理程序收集这些信息。

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2011-02-16
    • 2011-02-10
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多