Erlangアプリケーションを自動的に再起動します
-
27-09-2019 - |
質問
私は最近、Erlangアプリケーション全体が死亡したバグに出くわし、次のように見えるログメッセージが生成されました。
=INFO REPORT==== 11-Jun-2010::11:07:25 ===
application: myapp
exited: shutdown
type: temporary
このシャットダウンがどのようなものを引き起こしたのかわかりませんが、私が抱えている本当の問題は、それ自体が再起動しなかったことです。代わりに、今では空のエルランVMはそこに座って何もしていませんでした。
さて、私が行った研究から、他の「スタートタイプ」があるように見えます。「一時的」と「永続的」というアプリケーションを提供できます。
スーパーバイザーを開始した場合 以内に アプリケーション、私はそれを作るように言うことができます 特定のプロセス 一時的または永続的であり、それは私のために自動的にそれを再起動します。ただし、ドキュメントによると、 応用 一時的または永続的に、それは死んだときにそれを再起動しませんが、むしろ殺すことはありません 他のすべて アプリケーションも同様です。
私が本当にやりたいのは、特定のアプリケーションが常に実行されている必要があることをErlang VMに何らかの形で伝えることです。これは可能ですか?
(アプリケーションの上にスーパーバイザーを実装することについて話しているのではありません。なぜなら、それはキャッチ22です。スーパーバイザーのプロセスがクラッシュした場合はどうなりますか?私のために私のアプリケーションを再開します。)
ありがとう!
解決
これをトップレベルのスーパーバイザーで修正できるはずです:再起動戦略を設定して、100万秒ごとに100万回の再起動を許可すると、アプリケーションがクラッシュしないようにします。何かのようなもの:
init(_Args) -> {ok, {{one_for_one, 1000000, 1}, [{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}]}}.
他のヒント
使用できます 心臓 VMが下がった場合にVM全体を再起動するには、永続的なアプリケーションタイプを使用して、アプリケーションが終了したときにVMが終了することを確認します。
最終的には、監督者のプロセス、Erlang VM、またはあなたが書いたシェルスクリプトであろうと、信頼する必要があるアプリケーションの上に何かが必要です。
モニットを使用してから、合理的な再起動周波数でアプリケーション全体にスーパーバイザーを使用して、アプリケーションを設定して終了します。アプリケーションが終了すると、VMが終了し、モニットがすべてを再起動します。
VMを一度だけ再起動するので、心が十分に信頼できるようになることはありませんでした。