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

jde*_*vio 11 elixir erlang-otp

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

有关如何做到这一点的任何建议?

Gaz*_*ler 18

你可以使用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]}]
Run Code Online (Sandbox Code Playgroud)

返回一个列表,其中包含有关给定主管的所有子项的信息.

请注意,在低内存条件下监视大量子节点时调用此函数可能会导致内存不足异常.

此函数返回{id, child, type, modules}元组列表,其中:

  • id - 如子规范中所定义

  • child- 相应子进程的PID,:restarting如果进程即将重新启动,或者:undefined没有这样的进程

  • type- :worker或者:supervisor,根据儿童规范的规定

  • modules - 由子规范指定

由于提供了typepid,您可以递归地获取子项以生成所有pid的列表(如果需要).