Pregunta

Hace poco se encontró con un error en el que murió toda una aplicación de Erlang, dando un mensaje de registro que se parecía a esto:

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

No tengo idea de lo que dio origen a este apagado, pero el verdadero problema que tengo es que no se reiniciará. En cambio, el ahora vacío Erlang VM allí sentado sin hacer nada.

Ahora, desde la investigación que he hecho, parece que hay otros "tipos iniciar" se puede dar una aplicación:. 'Transitoria' y 'permanente'

Si comienzo a un Supervisor en una aplicación, te puedo decir que para hacer un proceso particular transitoria o permanente, y se reiniciará automáticamente para mí. Sin embargo, de acuerdo con la documentación, si hago un aplicación transitoria o permanente, no se reinicia cuando se muere, sino que mata todos los demás aplicaciones, así .

Lo que realmente quiero hacer es de alguna manera decirle al Erlang VM que una aplicación particular debe estar siempre en funcionamiento, y si se cae, vuelva a iniciarlo. ¿Es esto posible hacer?

(no estoy hablando de la implementación de un supervisor en la parte superior de mi solicitud, porque entonces es una captura 22:? ¿Y si mis bloquea el proceso del supervisor que estoy buscando algún tipo de API o el ajuste que puedo usar para tener monitor de Erlang y reiniciar mi solicitud para mí.)

Gracias!

¿Fue útil?

Solución

debe ser capaz de solucionar este problema en el supervisor de nivel superior: establecer la estrategia de reinicio para permitir que un millón se reinicia cada segundo, y la aplicación nunca debe bloquearse. Algo así como:

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

(Ejemplo adaptado del OTP Principios de diseño Guía del usuario .)

Otros consejos

Se puede usar corazón para reiniciar toda la máquina virtual si se cae, entonces el uso un tipo de aplicación permanente para asegurarse de que las salidas de VM cuando su aplicación se cierra.

En última instancia se necesita algo por encima de la aplicación que necesita confianza, si se trata de un proceso supervisor, el Erlang VM, o algún script que escribió -. Siempre será un problema si eso sucede a fallar también

Uso Monit, configuración, entonces su aplicación terminar mediante el uso de un supervisor para toda la aplicación con una frecuencia razonable reinicio. Si los terminada su aplicación, la expiración de la máquina virtual, y se reinicia monit todo.

Nunca pude corazón sea lo suficientemente fiable, ya que sólo se reinicia la máquina virtual una vez, y no trata bien con un kill -9 de la Erlang VM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top