Question

J'ai récemment rencontré un bug où une application Erlang ensemble est mort, ce qui donne un message de journal qui ressemblait à ceci:

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

Je ne sais pas ce qui a déclenché cet arrêt, mais le vrai problème est que je elle ne se redémarre. Au lieu de cela, la machine virtuelle Erlang maintenant vide juste assis là à ne rien faire.

, de la recherche que je l'ai fait, il semble qu'il y ait d'autres « start types », vous pouvez donner une application:. « Transitoire » et « permanent »

Si je commence un superviseur dans les une application, je peux le dire de faire un processus particulier transitoire ou permanente, et il il redémarre automatiquement pour moi. Toutefois, d'après la documentation, si je fais un application transitoire ou permanente, il ne redémarre pas quand il meurt, mais il tue tous les autres applications aussi bien .

Ce que je veux vraiment faire est de dire en quelque sorte la machine virtuelle Erlang qu'une application particulière doit toujours être en cours d'exécution, et si elle descend, redémarrez-le. Est-ce possible de le faire?

(je ne parle pas de la mise en œuvre d'un superviseur au-dessus de ma demande, car il y a un hic 22: si mes processus se bloque de superviseur, je suis à la recherche d'une sorte d'API ou un paramètre que je peux utiliser pour avoir Erlang moniteur et redémarrez ma demande pour moi.)

Merci!

Était-ce utile?

La solution

Vous devriez être en mesure de résoudre ce problème dans le superviseur de niveau supérieur: définir la stratégie pour permettre le redémarrage d'un million redémarre chaque seconde, et l'application ne doit jamais tomber en panne. Quelque chose comme:

init(_Args) ->
    {ok, {{one_for_one, 1000000, 1},
          [{ch3, {ch3, start_link, []},
            permanent, brutal_kill, worker, [ch3]}]}}.

(exemple adapté du OTP Principes de conception Guide de l'utilisateur .)

Autres conseils

Vous pouvez utiliser cœur pour redémarrer l'ordinateur virtuel complet si elle descend, alors l'utilisation un type d'application permanente pour vous assurer que la sortie VM quand vous sortez de l'application.

En fin de compte vous besoin de quelque chose au-dessus de votre application que vous devez faire confiance, que ce soit un processus superviseur, le Erlang VM, ou un script shell que vous avez écrit -. Il sera toujours un problème si cela se produit à l'échec aussi

Utilisez Monit, puis configurer votre application à mettre fin à l'aide d'un superviseur pour toute l'application avec une fréquence de redémarrage raisonnable. Si l'application se termine, les VM et se termine Monit tout redémarre.

je ne pourrais jamais obtenir de coeur pour être assez fiable, car il permet de redémarrer la machine virtuelle une fois, et il ne traite pas bien avec un kill -9 de la machine virtuelle Erlang.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top