問題タブ [erlang-supervisor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
process - trap_exit の Erlang 代替?
gen_server が停止しているときにコードを実行したいと考えています。gen_server トラップ出口があります ( process_flag(trap_exit, true)
init コールバックに追加しました)。terminate/2
これは、プロセスが終了する前に常に呼び出されるため、うまく機能します。リンクされたプロセスの終了をトラップしているため、クラッシュしても、作成した gen_server はクラッシュしないことがわかっています。私はこれを回避することができますが、process_flag(trap_exit, true)
これを達成するために使用する代替手段があるかどうか疑問に思っていますか?
「プロセスが終了する前」のコールバックが必要です。この出口のようなものは他にありますか?
erlang - simple_one_for_one スーパーバイザーの子の開始と終了
target_interceptor
登録および登録解除メッセージを受信すると、 の下でワーカーを開始または終了する単純なアプリケーションがありますsimple_one_for_one
rpc_server_supervisor
。
スーパーバイザーのコードrpc_server_supervisor
:
の登録メッセージtarget_interceptor
:
のメッセージを登録解除target_interceptor
:
Erlang の私のバージョンは: R15B01
最初の問題は、タプル {OK, Pid} = {error, <0.57.0>}; の登録アクションを処理するときです。何か問題が発生したことを示していますが、Pid 57 の gen_server rbmq_rpc_server は正しく機能しており、メッセージに応答しています。start_child 関数の戻り値がエラーになるのはなぜですか? 何が悪かったのか?
2 番目の問題は、登録解除アクションを処理するときです。ここで、ChildID ではなく Pid を参照しているにもかかわらず、supervisor:terminate_child(Sup,Pid) が {error,simple_one_for_one) を返します。なぜこのように動作し、スーパーバイザーの子を動的かつ個別に終了するにはどうすればよいですか?
編集:target_interceptor
との両方rpc_server_supervisor
がスーパーバイザーによってrbmq_sup_sup
監督されています:
編集: rpc_server_supervisor は target_interceptor init() 関数で呼び出されます (ここでの Sup は rbmq_sup_sup スーパーバイザーです):
erlang - Erlang: 長時間実行される init コールバックを処理するには?
監視ツリーの監視者gen_server
の下で、開始時に特定の数 (通常は 10 ~ 20) の子プロセスを開始しようとします。supervisor:start_child/2
必要な子プロセスごとに、gen_server の init コールバックが呼び出されます。への呼び出しsupervisor:start_child/2
は同期的であるため、子プロセスが開始されるまで戻りません。すべての子プロセスも gen_servers であるため、init コールバックが戻るまで start_link 呼び出しは戻りません。init コールバックでは、サードパーティ システムへの呼び出しが行われ、応答に時間がかかる場合があります (この問題は、サードパーティ システムへの呼び出しが 60 秒後にタイムアウトになったときに発見されました)。その間、init 呼び出しがブロックされました。つまり、supervisor:start_child/2
もブロックされます。したがって、呼び出した gen_server プロセス全体supervisor:start_child/2
無反応です。start_child 関数が戻るのを待っている間に gen_server タイムアウトを呼び出します。これは簡単に60秒以上続く可能性があるためです。アプリケーションが待機中に半開始状態で中断されているため、これを変更したいと思います。
この問題を解決する最善の方法は何ですか?
考えられる唯一の解決策は、サードパーティ システムと対話するコードを init コールバックから handle_cast コールバックに移動することです。これにより、init コールバックが高速になります。欠点は、gen_server:cast/2
すべての子プロセスが開始された後に呼び出す必要があることです。
これを行うより良い方法はありますか?
erlang-otp - escript で Elixir Supervisor を実行する方法
スーパーバイザーと GenServer を可能な限りシンプルに組み合わせたプロジェクトがあります。iex から呼び出す場合:
:mumble 呼び出しで例外が発生し、GenServer が再起動され、2 番目の :echo 呼び出しが正常に機能します。
他の方法でコードを実行すると、Supervisor は GenServer の再起動に失敗します。たとえば、次のようにメイン モジュールを使用してプロジェクトの escript を作成します。
:mumble 呼び出しで例外が発生し、Supervisor が GenServer を再起動することなく escript が終了します。
Supervisor モジュールと Server モジュールのコードは含めていません。これらは iex から呼び出されたときに正常に動作するためです。ここでは不要だと思います。
概念的な誤解がありますか? これは不可能ですか、それとも何か間違っていますか?
erlang - Erlangの手巻きスーパーバイザーで終了シグナルを処理しますか?
私が作成したプロセスのスーパーバイザーを作成しようとしています。私はこれをしばらくの間調査しましたが役に立たなかったので、誰かが助けてくれることを願っています.
これは課題用であるため、使用しなければならないインターフェースに特定の制限があるため、リストを使用した例や、Erlang サイトのより精巧な OTP の例も知っていますが、これらは適切ではありません。問題を示すために、アプリケーションから抜粋した例を提供しました。
通常の理由で終了した任意のワーカーを再起動しようとしています。ワーカー プロセスは次のとおりです。
スーパーバイザーでは、ワーカーを追跡して再起動するために ETS タブを使用しています。スーパーバイザーは次のようになります。
だから私はここで何かをしていると思います.my_modはスーパーバイザにリンクされているので、終了シグナルが通知されます.スーパーバイザはtrap_exitを設定して、スーパーバイザがシグナルを処理する機会を得る必要があります. しかし、** 例外 exit: stop がスローされるだけで、なぜそうなのかわかりませんか?
私のテストケースは次のとおりです。
誰かが私を正しい方向に向けることができますか?
erlang - Erlang の Cowboy がシャットダウン時にクラッシュする
カウボーイ ハンドラーに関連する Erlang vm のシャットダウン時に多くのエラーが発生します。cowboy:start_http() を実行する start_listeners() 関数を実行する simple_one_for_one スーパーバイザーがあります。
すべてが開始され、エラーは発生せず、リクエストは正常に処理されます。
erlang VM をシャットダウンすると、次のようになります。
[エラー] スーパーバイザーbitter_rpc_supには、コンテキストshutdown_errorで理由が殺された未定義の終了時にbitter_rpc_sup:start_listeners()で開始された子bitter_rpc_http_idがありました
そして、カウボーイプロセスが強制終了され、異常終了することに関連するその他のエラーの束。カウボーイは、シャットダウンの OTP 規則に従っていませんか? スーパーバイザーでシャットダウンをインターセプトし、すべてのカウボーイ プロセス/ランチ プールを手動でシャットダウンする方法はありますか?
このエラーを押しつぶすには、どこを調べればよいですか?
erlang - Erlangマルチモジュールを監視する方法
1 つのスーパーバイザで複数のモジュールを監視するにはどうすればよいですか?
このスーパーバイザーの実行を開始すると、次のように表示されます。
どうすればこの問題を解決できますか?
erlang - Erlang - スーパーバイザーと gen_fsm での例外終了
calculadora
、log_calculadora
およびの3 つのモジュールがありsupervisor_calculadora
ます。Calculadora
gen_fsm を使用して合計、減算、乗算、および除算を行う単純な計算機であり、スーパーバイザーはスーパーバイザーの動作を実装します。Calculadora はうまく動作calculadora
しますが、除算 0/0 または例外を作成したときにモジュールを再起動する必要があるスーパーバイザーを試してみると、機能しません。なんで?
PD: モジュールlog_calculadora
は、私が行った操作をcalculadora
log.txt ファイルに書き込むだけです。TEST モジュールは、私に例外終了を与えるモジュールです。