Erlang 监视重新启动进程的子进程

Erlang 监视重新启动进程的子进程,erlang,behavior,spawn,erlang-supervisor,Erlang,Behavior,Spawn,Erlang Supervisor,我有一个这样的结构 ------------- |Supervisor | ------------- | ------------- | Child1 | ------------- | ------------- | Child2 | ------------- 在这个结构中,child1受到监督,并生成child2。我需要的是在child2崩溃/退出时能够重新启动child1。实现这一目标的最佳方式是什么 查看Erlang文档: 您所要做的就是重新排列

我有一个这样的结构

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

在这个结构中,child1受到监督,并生成child2。我需要的是在child2崩溃/退出时能够重新启动child1。实现这一目标的最佳方式是什么

查看Erlang文档:

您所要做的就是重新排列进程树,并使用“一对一”重启策略。在我看来,孩子1和孩子2应该是主管的孩子

或者,如果您想保持当前的状态,您必须在进程Child1中捕获进程Child2的退出。当Child1退出时,所有Child1必须返回:

{stop, normal, State}

并由主管自动重新启动。主管必须处于
永久
重新启动模式。

如果在
Child2
崩溃时允许
Child1
崩溃,则现有主管 只需重新启动
Child1
,即可重新启动
Child2

但这取决于
Child1
Child2
崩溃时崩溃。另一种选择 是在流程树中插入另一个主管:

Change this:                          Into this:

+------------+                      +------------+
| Supervisor |                      | Supervisor |
+------------+                      +------------+
      |                                   |
+------------+                      +------------+
|   Child1   |  New supervisor ---> | Supervisor |
+------------+                      +------------+
      |                               |      |
+------------+              +------------+ +---------+
|   Child2   |              |   Child1   | |  Child2 |
+------------+              +------------+ +---------+
      |                                        |
 other service                            other service
新的主管只处理两个孩子,作为他们自己的服务,允许
任何一方的死亡都会以可配置的方式影响另一方。

如果您允许
Child1
Child2
崩溃时崩溃,您的主管只需重新启动它即可。你的主管为什么不自己启动这两个过程,有没有令人信服的原因?不要捕捉来自Child2的退出信号。Child1应该是常规流程,而不是系统流程。这样,当Child2终止时,Child1也会终止,并且主管会重新启动Child1,这会启动Child2。@sarnold是的,有。Child1启动Child2启动服务完成后感谢您的回答,我只是使用spawn_链接启动Child2,如果Child2崩溃,让它们都崩溃。@sarnold如果您将您的评论重新格式化为答案,我可以接受它并关闭问题。