我有一个 Phoenix 应用程序,它创建以下监督树(取自 erlang 观察者):
supervisor的重启策略是:one_to_one。期望的是,如果我终止任何受监督进程,该单个进程将由主管立即重新启动。这是遥测过程中唯一的情况。如果任何突出显示的进程被终止(使用 iEX 中的观察者或 Process.exit),则会发生以下情况:
这是之后更新的应用程序树,似乎整个 Phoenix 应用程序崩溃了。所有API请求都找不到服务器:
这更多的是在主管上使用
Process.exit(pid, :kill)
的问题。 :kill
是最后的手段信号,它会导致主管“立即终止”,而不通知其子级正确终止。所以主管退出,孩子们现在必须注意到他们的父母已经死了,清理并终止。
同时,应用程序同时重新启动树的一部分,这最终与仍在关闭的旧树发生冲突,导致另一次失败。这最终会触发 max_restarts 并关闭应用程序。
整体:
当进程没有响应任何其他退出信号时,仅使用
:kill
:kill
会导致
如果你想模拟停止主管,Supervisor.stop
运行
iex --logger-sasl-reports true -S mix phx.server