5

最近、Erlang アプリケーション全体が停止するバグに遭遇し、次のようなログ メッセージが生成されました。

=INFO REPORT==== 11-Jun-2010::11:07:25 ===
     application: myapp
     exited: shutdown
     type: temporary

何がこのシャットダウンを引き起こしたのかわかりませんが、私が抱えている本当の問題は、それ自体が再起動しなかったことです. 代わりに、空になった Erlang VM はただそこに座って何もしませんでした。

今、私が行った調査から、アプリケーションに与えることができる他の「開始タイプ」があるように見えます:「一時的」と「永続的」。

アプリケーションでスーパーバイザーを起動すると、特定のプロセスを一時的または永続的にするように指示でき、自動的に再起動します。ただし、ドキュメントによると、アプリケーションを一時的または永続的にすると、アプリケーションが終了しても再起動せず、他のすべてのアプリケーションも強制終了します。

私が本当にやりたいことは、Erlang VM に、特定のアプリケーションを常に実行し、ダウンした場合は再起動するように指示することです。これは可能ですか?

(アプリケーションの上にスーパーバイザを実装することについて話しているわけではありません。なぜなら、それはキャッチ 22: スーパーバイザ プロセスがクラッシュした場合はどうなるでしょうか? Erlang で監視し、アプリケーションを再起動してください。)

ありがとう!

4

3 に答える 3

5

これはトップレベルのスーパーバイザーで修正できるはずです。再起動戦略を設定して、毎秒100万回の再起動を許可すると、アプリケーションがクラッシュすることはありません。何かのようなもの:

init(_Args)->
    {ok、{{one_for_one、1000000、1}、
          [{ch3、{ch3、start_link、[]}、
            パーマネント、brutal_kill、worker、[ch3]}]}}。

OTP設計原則ユーザーガイドから採用された例。)

于 2010-06-16T16:51:18.867 に答える
5

VM がダウンした場合はheartを使用して VM 全体を再起動し、永続的なアプリケーション タイプを使用して、アプリケーションが終了したときに VM が確実に終了するようにすることができます。

最終的には、スーパーバイザ プロセス、erlang VM、または作成したシェル スクリプトなど、信頼する必要があるアプリケーションの上に何かが必要です。それがたまたま失敗した場合は常に問題になります。

于 2010-06-16T18:57:14.903 に答える
4

Monit を使用し、適切な再起動頻度でアプリケーション全体のスーパーバイザーを使用して終了するようにアプリケーションをセットアップします。アプリケーションが終了すると VM も終了し、monit はすべてを再起動します。

Heart は VM を 1 回だけ再起動するだけで、erlang VM の kill -9 をうまく処理できないため、十分な信頼性を得ることができませんでした。

于 2010-06-17T13:33:07.727 に答える