我在https://github.com/bvdeenen/otp_super_nukes_all设置了一个简单的测试用例,它显示了一个otp应用程序:stop()实际上杀死了其子项的所有生成的进程,即使是那些未关联。
测试用例包括一个gen_server(注册为par),产生一个普通的erlang进程(注册为par_worker)和一个gen_server(注册为reg_child),它还产生一个普通的erlang进程(注册为child_worker)。调用应用程序:stop(test_app)在'par'gen_server上正常终止,但在所有其他人上退出(kill)!
这是名义上的行为吗?如果是这样,它在哪里记录,我可以禁用它吗?我希望我从gen_server(而不是链接)生成的进程在应用程序终止时保持活动状态。
由于
Bart van Deenen
答案 0 :(得分:5)
application手册说(停止/ 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)更改已启动流程的group_leader - >是的(参见:http://www.erlang.org/doc/man/erlang.html#group_leader-2)。更改group_leader可能会避免在应用程序结束时终止您的进程。
答案 1 :(得分:0)
我也犯了错误,发现它必须发生。
如果父进程死亡,所有子进程都会处理死亡,无论它是什么注册。
如果没有发生这种情况,我们必须跟踪所有正在运行的进程并确定哪些是孤立的,哪些不是孤立的。你可以猜到它会有多难。你可以想到unix ppid和pid。如果你杀了ppid,所有的孩子也会死。这,我认为这一定必须发生。
如果您希望流程独立于您的应用程序,您可以向其他应用程序发送消息以启动流程。
other_application_module:start_process(ProcessInfo).