2

https://github.com/bvdeenen/otp_super_nukes_allで簡単なテストケースを設定しました。これは、otp application:stop() が、リンクされていないものも含め、その子によって生成されたすべてのプロセスを実際に強制終了することを示しています。

テスト ケースは、プレーンな erlang プロセス (par_worker として登録) を生成する 1 つの gen_server (par として登録) と、プレーンな erlang プロセス (child_worker として登録) も生成する gen_server (reg_child として登録) で構成されます。application:stop(test_app) を呼び出すと、'par' gen_server では通常の終了が行われますが、他のすべてのサーバーでは exit(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 を group_leader(GroupLeader, Pid) -> true で変更できる場合があります (参照: 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 に答える