问题标签 [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.
erlang - 当主管子从 start_link 返回错误时,如何始终记录/显示错误原因?
当gen_server
从主管(它本身由应用程序启动)开始时,我遇到的问题是,当start_link
gen_server 没有返回{ok, ...}
但{error, Reason}
我看到的唯一错误消息是:
Reason
不显示/记录用于终止的那个。
有没有办法查看/记录这些错误返回给主管?
我正在使用的 childspec 是例如:
编辑:澄清
我知道 error_logger 并且已经在使用它。问题不是如何记录某些内容,而是如何让主管记录它终止的原因,例如记录谁因错误返回而终止以及它返回了什么。
只是为了解决这个问题,是的,我用 sasl 开始 erlang:
erlang - 主管是否需要启动自己的主管?
假设我有一个主管,我需要start_child
为这个主管执行一些。我必须先启动所有启动我的主管吗?或者我只能supervisor:start_child(my_sup,[])
在没有 my_sup 的情况下启动?
erlang - Erlang:supervisor(3),添加子进程
我在哪里可以找到有关如何将动态子进程添加到现有主管(simple_one_for_one
重启策略)的示例?
erlang - Erlang 动态主管启动 gen_server
我有创建其他主管的根主管:
我有 gen_server - 监听器。popd_listener_sup
创建主管时,如何使用主管运行此 gen_server ?
谢谢你。
erlang - 如何在动态主管中自动删除终止子项的规范
这个问题不需要USB知识,只是将其描述为使示例更加具体。
我正在尝试为 USB 总线上的特定设备实现动态管理器。这些设备具有地址,并在系统的生命周期内出现和消失。
对于每个设备,我的主管都需要一个动态的孩子。
这些孩子是暂时的,所以一旦它们崩溃或终止,我们就不会重新启动它们(因为那时它们可能已经消失了)。
我有一个进程在特定时间扫描 USB 端口并生成我要处理的 USB 设备的所有地址的列表。
我计划supervisor:which_children/1
在每次扫描之前调用以找出哪些设备存在但没有运行子进程。
为了找出哪些地址有孩子在运行,我计划为包含地址的 childspec 创建 Id 原子(只有几个地址可能),例如, adr_12
如果孩子处理 address 12
。
当我尝试启动/重新启动丢失的孩子时,我遇到了一些丑陋的情况,即当临时孩子终止或崩溃时,孩子规范不会自动删除(至少我认为是这样)。所以我需要这样的代码:
然后是我不知道是否supervisor:which_children/1
也返回已经终止的孩子的问题。
因此,最好在子节点暂时终止后将其删除。
不知何故,这一切对我来说都是不雅的,所以我问自己(和你):
我怎样才能最优雅地解决这个问题?
在这种情况下完全不使用主管会更好吗?
erlang - Erlang:我应该以编写任务调度程序结束什么监督树?
主要出于教育目的,我正在尝试编写任务(任务是 open_port({spawn_executable, Command}))调度程序。
我最终得到了像这样的树
换句话说:
- 最高主管启动调度程序和接收器并确保它们处于活动状态
- 接收器启动中间主管
- 中级主管启动调度程序并确保它处于活动状态
- 调度员启动底层主管
底层主管根据请求启动任务,并确保在出现错误时重新启动它们
在任何时候调度程序都准备好接受一个带有时间戳的任务,它应该在
- 当时间戳满足时,它会通知一些 event_manager
- 然后接收者由同一个事件管理器通知,并通过中间主管将消息传递给调度程序
- dispatcher 有一些业务逻辑,这就是为什么它不是无状态的,例如某些任务不能同时执行
- 当满足所有条件时,调度程序将任务传递给底层主管,确保任务执行,直到获得正常退出或绕过某些阈值
- 底部主管返回一条消息,然后向上向上传递给某个事件管理器
- 调度程序最终收到此消息,从其队列中删除任务或重新入队或其他
问题是:
- 我的行为正确吗?
- 结构是不是太复杂了?(但是,将来该系统将变得分布式。)
- 有没有办法将receiver+middle supervisor和dispatcher+bottom supervisor组合成两个模块,而不是四个同时实现4个行为?
- 或者有没有办法将receiver+dispatcher+bottom supervisor组合在一个模块中,省去中间supervisor,同时实现gen_event+gen_server+supervisor行为?
- 我是否错误地将行为视为 OO 语言中的接口或多重继承?(这让我提出问题 3 和 4。)
提前致谢。
PS IMO,一方面结构过于复杂;另一方面,这样的结构让我可以将它的任何块分发(例如,多个调度器到一个接收器,一个调度器到多个接收器,许多调度器到多个接收器,每个接收器有多个调度器,甚至每个调度器有多个底层监督器- 每一层都有自己的监督策略)。复杂性和可扩展性之间的平衡点在哪里?
erlang - 重新启动孩子时主管会阻止呼叫吗?
我试图了解这里发生了什么:
我有一个主管在不触发MaxR, MaxT
机制的情况下循环重启一个客户端。客户端只是缓慢地崩溃,永远不会触发速率限制。
将有另一种机制使用supervisor:which_children/1
并delete_child/2, start_child/2
调整子集以适应现实(它扫描 USB 设备,试图让每个设备找到一个监督子)。
这通常表现为速率限制的安全网,但奇怪的是,它看起来根本没有调用删除和启动子项的机制。
为了找出发生了什么,我supervisor:which_children/1
从 shell 调用,看起来调用只是阻塞并且永远不会返回。
是否会在它忙于尝试重新启动孩子时阻止对主管的呼叫?
附录:
看起来崩溃发生在子启动期间:
erlang - 达到_max_restart_intensity 的主管如何只删除有问题的孩子?
我有一个one_for_one
主管,负责处理类似且完全独立的孩子。
当一个孩子出现问题时,反复崩溃和触发:
关闭自己并终止所有无辜的孩子,否则这些孩子会继续正常运行。
如何从标准 Erlang 监督者中构建监督树,只停止重新启动一个有问题的孩子而让其他孩子独自一人?
我正在考虑增加一个只带一个孩子的主管,但这对我来说似乎很重要。
还有其他方法来处理这个吗?
erlang - 在 Erlang 集群中的所有节点上运行 gen_server 的最佳方法是什么?
我正在Erlang 中构建一个监控工具。在集群上运行时,它应该在所有节点上运行一组数据收集功能,并使用 RRD 在单个“记录器”节点上记录该数据。
当前版本在主节点 ( rolf_node_sup
) 上运行一个主管,它尝试在集群中的每个节点 ( ) 上运行第二个主管rolf_service_sup
。然后,每个节点上的监督者应该启动并监视一堆进程,这些进程将消息发送回主节点上的 gen_server ( rolf_recorder
)。
这仅在本地有效。没有在任何远程节点上启动主管。我使用以下代码尝试从记录器节点加载节点上的主管:
我发现有几个人建议主管真的只为本地流程设计。例如
实现我要求在集群中的所有节点上运行监督代码的最 OTP 方式是什么?
- 建议将分布式应用程序作为分布式主管树的一种替代方案。这些不适合我的用例。它们提供节点之间的故障转移,但保持代码在一组节点上运行。
- 池模块很有趣。但是,它允许在当前负载最少的节点上运行作业,而不是在所有节点上运行。
- 或者,我可以在主节点上创建一组受监督的“代理”进程(每个节点一个),用于
proc_lib:spawn_link
在每个节点上启动一个监督者。如果节点上出现问题,代理进程应该死掉,然后由它的主管重新启动,这反过来又应该重新启动远程进程。从模块在这里可能非常有用。 - 或者,也许我过于复杂了。直接监督节点是一个坏主意,相反,也许我应该构建应用程序以更松散耦合的方式收集数据。通过在多个节点上运行应用程序来构建一个集群,告诉一个成为主节点,就这样吧!
一些要求:
- 该架构应该能够处理节点加入和离开池而无需人工干预。
- 为了简单起见,我想构建一个单主解决方案,至少最初是这样。
- 在我的实现中,我更愿意使用现有的 OTP 工具而不是手动代码。
erlang - Erlang:谁监督主管?
在我见过的所有 Erlang 主管示例中,通常有一个“主”主管负责监督整个树(或者至少是主管树中的根节点)。如果“主人”主管坏了怎么办?“主人”——主管应该如何监管??任何典型的模式?