2

我在https://github.com/bvdeenen/otp_super_nukes_all设置了一个简单的测试用例,它表明 otp application:stop() 实际上会杀死所有由其子进程生成的进程,即使是那些未链接的进程。

测试用例由一个 gen_server(注册为 par)生成一个普通的 erlang 进程(注册为 par_worker)和一个 gen_server(注册为 reg_child),它也生成一个普通的 erlang 进程(注册为 child_worker)。调用 application:stop(test_app) 会在 'par' gen_server 上正常终止,但会在所有其他服务器上退出(kill)!

这是名义行为吗?如果是这样,它在哪里记录,我可以禁用它吗?我希望从我的 gen_server(不是链接)产生的进程在应用程序终止时保持活动状态。

谢谢

巴特·范迪南

4

2 回答 2

5

应用手册说(对于stop/1 功能):

Last, the application master itself terminates. Note that all processes with the
application master as group leader, i.e. processes spawned from a process belonging
to the application, thus are terminated as well.

所以我猜你不能修改这种行为。

编辑:您也许可以使用 group_leader(GroupLeader, Pid) -> true 更改已启动进程的 group_leader (请参阅:http ://www.erlang.org/doc/man/erlang.html#group_leader-2 )。更改 group_leader 可能会让您避免在应用程序结束时终止进程。

于 2012-05-11T10:42:58.933 回答
0

我也犯了这个错误,发现它一定会发生。

如果父进程死亡,则所有子进程都会死亡,无论它是否注册。

如果这没有发生,我们必须跟踪所有正在运行的进程并找出哪些是孤立的,哪些不是。你可以猜到会有多难。你可以想到unix ppid和pid。如果你杀死 ppid,所有的孩子也会死。这,我认为这必须发生。

如果您想让进程独立于您的应用程序,您可以向其他应用程序发送消息以启动进程。

other_application_module:start_process(ProcessInfo).
于 2012-05-11T14:05:11.447 回答