OTP スーパーバイザの動作のこの種のカスタマイズは、簡単には実行できないと思います。OTP スーパーバイザの設計方法により、いくつかの厳密な設計慣行に従う必要があります。この場合の最も重要なことは、スーパーバイザーは、異常終了の場合に子を監視して再起動すること以外に何もすべきではないということです。スーパーバイザにバグを導入しないように、スーパーバイザにロジックを追加しないでください。これは、スーパーバイザ ツリーとフォールト トレランスの重要な部分です。
子が死亡したとき、クラッシュ前と同じ状態で再起動したい
- これは一般的に悪い習慣である.確実に問題を起こす
このような場合の標準的なアプローチはありますか?
スーパーバイザー内の子の状態をカスタマイズして再起動することは、スーパーバイザーの優れた設計慣行に反します。したがって、この種のタスクは通常、別のプロセスを導入するなど、別のプロセスを導入することによって行われます。たとえば、gen_server はスーパーバイザー (supervisor:start_child) を介して子を開始し、すべてのプロセスでモニターを維持します。この追加プロセスにより、新しい子を開始する前に必要なカスタマイズを行うことができます。
OTPを使用して終了プロセスのPidを取得するには?
- Supervisor:start_child を介して子を開始する追加のプロセスでは、それらを監視してから DOWN メッセージを聞くことができます。たとえば、gen_server の場合、次のように handle_info 関数を使用します。
handle_info({'DOWN', Ref, process, _Pid, _}, S) ->
handle_down_worker(Ref, _Pid, S).
または、終了直前の子の状態を取得して、子をクラッシュ前と同じ状態に戻すことは可能でしょうか?
- 間違っていたら訂正してください。Erlang では、「DOWN」メッセージとともに、終了直前に子プロセスの状態を送信することはできないと思います。それが可能であれば、{DOWN, Pid, Reason, State} のようなメッセージを処理し、同じ状態またはその一部でプロセスを再起動できます。しかし、私は考えています..たとえば exit(Pid, kill) で殺された突然死にかけている子供の状態をどのように保存できますか? 私はそれが可能であろうとは思わない.