问题标签 [erlang-supervisor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
916 浏览

erlang - 当主管子从 start_link 返回错误时,如何始终记录/显示错误原因?

gen_server从主管(它本身由应用程序启动)开始时,我遇到的问题是,当start_linkgen_server 没有返回{ok, ...}{error, Reason}我看到的唯一错误消息是:

Reason不显示/记录用于终止的那个。

有没有办法查看/记录这些错误返回给主管?

我正在使用的 childspec 是例如:

编辑:澄清

我知道 error_logger 并且已经在使用它。问题不是如何记录某些内容,而是如何让主管记录它终止的原因,例如记录谁因错误返回而终止以及它返回了什么。

只是为了解决这个问题,是的,我用 sasl 开始 erlang:

0 投票
2 回答
3890 浏览

erlang - 主管是否需要启动自己的主管?

假设我有一个主管,我需要start_child为这个主管执行一些。我必须先启动所有启动我的主管吗?或者我只能supervisor:start_child(my_sup,[])在没有 my_sup 的情况下启动?

0 投票
2 回答
7761 浏览

erlang - Erlang:supervisor(3),添加子进程

我在哪里可以找到有关如何将动态子进程添加到现有主管(simple_one_for_one重启策略)的示例?

0 投票
1 回答
4815 浏览

erlang - Erlang 动态主管启动 gen_server

我有创建其他主管的根主管:

我有 gen_server - 监听器。popd_listener_sup创建主管时,如何使用主管运行此 gen_server ?

谢谢你。

0 投票
2 回答
818 浏览

erlang - 如何在动态主管中自动删除终止子项的规范

这个问题不需要USB知识,只是将其描述为使示例更加具体。

我正在尝试为 USB 总线上的特定设备实现动态管理器。这些设备具有地址,并在系统的生命周期内出现和消失。

对于每个设备,我的主管都需要一个动态的孩子。

这些孩子是暂时的,所以一旦它们崩溃或终止,我们就不会重新启动它们(因为那时它们可能已经消失了)。

我有一个进程在特定时间扫描 USB 端口并生成我要处理的 USB 设备的所有地址的列表。

我计划supervisor:which_children/1在每次扫描之前调用以找出哪些设备存在但没有运行子进程。

为了找出哪些地址有孩子在运行,我计划为包含地址的 childspec 创建 Id 原子(只有几个地址可能),例如, adr_12如果孩子处理 address 12

当我尝试启动/重新启动丢失的孩子时,我遇到了一些丑陋的情况,即当临时孩子终止或崩溃时,孩子规范不会自动删除(至少我认为是这样)。所以我需要这样的代码:

然后是我不知道是否supervisor:which_children/1也返回已经终止的孩子的问题。

因此,最好在子节点暂时终止后将其删除。

不知何故,这一切对我来说都是不雅的,所以我问自己(和你):

我怎样才能最优雅地解决这个问题?

在这种情况下完全不使用主管会更好吗?

0 投票
1 回答
816 浏览

erlang - Erlang:我应该以编写任务调度程序结束什么监督树?

主要出于教育目的,我正在尝试编写任务(任务是 open_port({spawn_executable, Command}))调度程序。

我最终得到了像这样的树

换句话说:

  1. 最高主管启动调度程序和接收器并确保它们处于活动状态
  2. 接收器启动中间主管
  3. 中级主管启动调度程序并确保它处于活动状态
  4. 调度员启动底层主管
  5. 底层主管根据请求启动任务,并确保在出现错误时重新启动它们

  6. 在任何时候调度程序都准备好接受一个带有时间戳的任务,它应该在

  7. 当时间戳满足时,它会通知一些 event_manager
  8. 然后接收者由同一个事件管理器通知,并通过中间主管将消息传递给调度程序
  9. dispatcher 有一些业务逻辑,这就是为什么它不是无状态的,例如某些任务不能同时执行
  10. 当满足所有条件时,调度程序将任务传递给底层主管,确保任务执行,直到获得正常退出或绕过某些阈值
  11. 底部主管返回一条消息,然后向上向上传递给某个事件管理器
  12. 调度程序最终收到此消息,从其队列中删除任务或重新入队或其他

问题是:

  1. 我的行为正确吗?
  2. 结构是不是太复杂了?(但是,将来该系统将变得分布式。)
  3. 有没有办法将receiver+middle supervisor和dispatcher+bottom supervisor组合成两个模块,而不是四个同时实现4个行为?
  4. 或者有没有办法将receiver+dispatcher+bottom supervisor组合在一个模块中,省去中间supervisor,同时实现gen_event+gen_server+supervisor行为?
  5. 我是否错误地将行为视为 OO 语言中的接口或多重继承?(这让我提出问题 3 和 4。)

提前致谢。

PS IMO,一方面结构过于复杂;另一方面,这样的结构让我可以将它的任何块分发(例如,多个调度器到一个接收器,一个调度器到多个接收器,许多调度器到多个接收器,每个接收器有多个调度器,甚至每个调度器有多个底层监督器- 每一层都有自己的监督策略)。复杂性和可扩展性之间的平衡点在哪里?

0 投票
1 回答
627 浏览

erlang - 重新启动孩子时主管会阻止呼叫吗?

我试图了解这里发生了什么:

我有一个主管在不触发MaxR, MaxT机制的情况下循环重启一个客户端。客户端只是缓慢地崩溃,永远不会触发速率限制。

将有另一种机制使用supervisor:which_children/1delete_child/2, start_child/2调整子集以适应现实(它扫描 USB 设备,试图让每个设备找到一个监督子)。

这通常表现为速率限制的安全网,但奇怪的是,它看起来根本没有调用删除和启动子项的机制。

为了找出发生了什么,我supervisor:which_children/1从 shell 调用,看起来调用只是阻塞并且永远不会返回。

是否会在它忙于尝试重新启动孩子时阻止对主管的呼叫?

附录:

看起来崩溃发生在子启动期间:

0 投票
1 回答
5933 浏览

erlang - 达到_max_restart_intensity 的主管如何只删除有问题的孩子?

我有一个one_for_one主管,负责处理类似且完全独立的孩子。

当一个孩子出现问题时,反复崩溃和触发:

关闭自己并终止所有无辜的孩子,否则这些孩子会继续正常运行。

如何从标准 Erlang 监督者中构建监督树,只停止重新启动一个有问题的孩子而让其他孩子独自一人?

我正在考虑增加一个只带一个孩子的主管,但这对我来说似乎很重要。

还有其他方法来处理这个吗?

0 投票
2 回答
3169 浏览

erlang - 在 Erlang 集群中的所有节点上运行 gen_server 的最佳方法是什么?

我正在Erlang 中构建一个监控工具。在集群上运行时,它应该在所有节点上运行一组数据收集功能,并使用 RRD 在单个“记录器”节点上记录该数据。

当前版本在主节点 ( rolf_node_sup) 上运行一个主管,它尝试在集群中的每个节点 ( ) 上运行第二个主管rolf_service_sup。然后,每个节点上的监督者应该启动并监视一堆进程,这些进程将消息发送回主节点上的 gen_server ( rolf_recorder)。

这仅在本地有效。没有在任何远程节点上启动主管。我使用以下代码尝试从记录器节点加载节点上的主管:

我发现有几个人建议主管真的只为本地流程设计。例如

实现我要求在集群中的所有节点上运行监督代码的最 OTP 方式是什么?

  • 建议将分布式应用程序作为分布式主管树的一种替代方案。这些不适合我的用例。它们提供节点之间的故障转移,但保持代码在一组节点上运行。
  • 模块很有趣。但是,它允许在当前负载最少的节点上运行作业,而不是在所有节点上运行。
  • 或者,我可以在主节点上创建一组受监督的“代理”进程(每个节点一个),用于proc_lib:spawn_link在每个节点上启动一个监督者。如果节点上出现问题,代理进程应该死掉,然后由它的主管重新启动,这反过来又应该重新启动远程进程。模块在这里可能非常有用。
  • 或者,也许我过于复杂了。直接监督节点是一个坏主意,相反,也许我应该构建应用程序以更松散耦合的方式收集数据。通过在多个节点上运行应用程序来构建一个集群,告诉一个成为主节点,就这样吧!

一些要求:

  • 该架构应该能够处理节点加入和离开池而无需人工干预。
  • 为了简单起见,我想构建一个单主解决方案,至少最初是这样。
  • 在我的实现中,我更愿意使用现有的 OTP 工具而不是手动代码。
0 投票
3 回答
1369 浏览

erlang - Erlang:谁监督主管?

在我见过的所有 Erlang 主管示例中,通常有一个“主”主管负责监督整个树(或者至少是主管树中的根节点)。如果“主人”主管坏了怎么办?“主人”——主管应该如何监管??任何典型的模式?