2012-05-11 1 views
2

私は、OTPアプリケーションがあることを示してhttps://github.com/bvdeenen/otp_super_nukes_allで簡単なテスト・ケース設定しました:()実際にその子によってすべて生成されたプロセス、にリンクされていないものも含めを殺す停止します。Otpアプリケーション:stop(..)はspawn_linkされたプロセスだけでなく、生成されたプロセスをすべて終了させますか?

テストケースは、プレーンなerlangプロセス(par_workerとして登録)とgen_server(reg_childとして登録)を生成する1つのgen_server(parとして登録)から成り立ち、プレーンなプロセスを生成します。アプリケーション呼び出し:stop(test_app)は、 'par' gen_serverでは正常終了しますが、他のすべてでは終了(kill)します!

これは名目上の動作ですか?もしそうなら、それはどこに文書化されていますか?それを無効にすることはできますか?私は私のgen_server(リンクではない)からアプリケーションが終了したときに生き続けるために、プロセスを生成したい。

おかげ

バートバンDeenen

答えて

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. 

だから私はあなたがこの動作を変更傾けると思います。

EDIT:あなたはgroup_leader(GroupLeader、PID)を開始し、プロセスのgroup_leaderを変更することができるかもしれない - >真(参照:http://www.erlang.org/doc/man/erlang.html#group_leader-2)。 group_leaderを変更すると、アプリケーション終了時にプロセスが終了することを避けることができます。

+0

Thans、私もgroup_leaderを見つけました。それは私には分かりませんでしたが、私はたくさんのことを学びました!それは動作します: 'group_leader(whereis(init)、Pid)'は、私のプロセスを生き残らせます。複雑な理由から、実際のシステムで分散アプリケーションのアップグレードを行う必要があります。 –

+0

偉大な、あなた自身の質問に答えることができますか、またはこれが正確な解決策/答えだった場合は、回答としてマーク:) – marcelog

0

私もその間違いを犯し、それが起こらなければならないことを知りました。

親プロセスが終了すると、登録されているかどうかにかかわらず、すべての子プロセスが終了します。

これが起こらない場合は、実行中のすべてのプロセスを追跡し、孤立しているプロセスとそうでないプロセスを把握する必要があります。それがいかに難しいかを推測することができます。あなたはunix ppidとpidを考えることができます。あなたがppidを殺すと、すべての子供たちも死ぬ。これは、これが起こらなければならないと思います。

プロセスをアプリケーションから独立させたい場合は、他のアプリケーションにメッセージを送信してプロセスを開始できます。

other_application_module:start_process(ProcessInfo). 
+0

私は実際に分散アプリケーションの別のノードで生成されたプロセスを複製するので、これを行う必要があります。答えをありがとう。 –

関連する問題