监督重启过程的子进程

时间:2011-10-24 22:43:10

标签: erlang behavior spawn supervisor

我有这样的结构

-------------
|Supervisor |
-------------
      |
-------------
|  Child1   |
-------------
      |
-------------
|  Child2   |
-------------

在这个结构中,child1受到监督,它产生了child2。我需要的是能够在child2崩溃/退出时重启child1。哪个是实现这个目标的最佳方法?

2 个答案:

答案 0 :(得分:1)

如果Child1Child2崩溃时允许Child1崩溃,那么您现有的主管就会崩溃 只需重新启动Child2,即可重新启动Child1

但是当Child2崩溃时,这取决于Change this: Into this: +------------+ +------------+ | Supervisor | | Supervisor | +------------+ +------------+ | | +------------+ +------------+ | Child1 | New supervisor ---> | Supervisor | +------------+ +------------+ | | | +------------+ +------------+ +---------+ | Child2 | | Child1 | | Child2 | +------------+ +------------+ +---------+ | | other service other service 崩溃。另外一个选项 是在进程树中插入另一个主管:

{{1}}

新主管只处理两个孩子作为他们自己的服务,允许 任何一方的死亡都以可配置的方式影响另一方。

答案 1 :(得分:0)

查看Erlang文档:http://www.erlang.org/doc/design_principles/sup_princ.html

您所要做的就是重新安排流程树并使用one_for_all重启策略。在我的意见中,Child1和Child2应该是主管的孩子。

或者,如果你想保留像他们那样的东西,你必须在进程Child1中捕获进程Child2的EXIT。当EXIT到达Child1时,所有Child1都必须返回:

{stop, normal, State}

并且它将由Supervisor重新启动。主管必须处于permanent重启模式。