在Hex docs for Supervisor中,有一行说明:
使用此模块实施的主管具有一组标准的接口功能,并包含跟踪和错误报告功能。
不幸的是,我无法弄清楚如何做到这一点。我想要的是当Supervisor
检测到童工已经崩溃并正在重新启动时触发的某种钩子/通知/事件。主要是,我只想记录一个工人崩溃的事实,以便我可以向用户显示此错误,在我的情况下,这需要将错误消息写入数据库中的字段。
我错过了什么?在某个地方,我可以传递一个在孩子被终止时会被调用的函数或模块吗?
答案 0 :(得分:2)
儿童崩溃时的错误记录在BEAM中的SASL记录器中,我认为这是“标准接口函数集”所指的文档。有关更多详细信息,请参阅http://erlang.org/doc/apps/sasl/error_logging.html和http://erlang.org/doc/man/error_logger.html。
如果您正在使用:simple_one_for_one
主管启动工作人员,那么您可能会考虑自己监控,而不是深入研究SASL的内容。 e.g。
def MyApp.SomeModule do
use GenServer
# ... init etc.
def start_worker() do
{:ok, pid} = SomeWorkerSupervisor.start_child()
Process.monitor(pid)
end
def handle_info(:'DOWN', _, _, worker_pid, reason) do
# ... something
end
end
reason
将是:
进程的退出原因,noproc(监视器创建时不存在进程或端口)或noconnection(没有连接到受监视进程所在的节点)。