Elixir - 获取监管进程下所有进程的PID

17

我有一个Supervisor,想要知道在任何时间运行在该Supervisor下的所有进程。似乎应该有一种简单的方法来获取在Supervisor或节点下的所有进程的所有PID、名称等信息,但我找不到任何东西。

有什么建议可以做到这一点吗?


为了以后的参考,Elixir Supervisor 模块的文档在这里:http://elixir-lang.org/docs/stable/elixir/Supervisor.html - Onorio Catenacci
1个回答

28

您可以使用Supervisor.which_children/1函数:

iex> Supervisor.which_children(MyApp.Supervisor)
[{MyApp.SubSupervisor, #PID<0.1695.0>, :supervisor, [MyApp.SubSupervisor]},
 {MyApp.Endpoint, #PID<0.1686.0>, :supervisor, [MyApp.Endpoint]}]

返回一个包含给定监管者所有子进程信息的列表。

请注意,在低内存条件下监管大量子进程时调用此函数可能会导致内存不足异常。

此函数返回一个由{id, child, type, modules}元组组成的列表,其中:

  • id- 如同在子规范中定义的那样

  • child- 相应子进程的PID,如果该进程即将重新启动,则为:restarting,否则为:undefined(没有这样的进程)

  • type- 如同在子规范中指定的:worker:supervisor

  • modules- 如同在子规范中指定的那样

由于提供了类型和PID,如果需要,您可以递归获取子进程以生成所有PID的列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接