2010-06-16 17 views
5

Recientemente me encontré con un error en el que murió toda una aplicación de Erlang, dando un mensaje de registro que se veía así:reiniciar automáticamente las aplicaciones Erlang

=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 problema real que tener es que no se reinició a sí mismo. En cambio, la máquina virtual Erlang ahora vacía solo se sentó allí sin hacer nada.

Ahora, de la investigación que he hecho, parece que hay otros "tipos de inicio" que puede dar a una aplicación: "transitoria" y "permanente".

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

Lo que realmente quiero hacer es decirle a la máquina virtual de Erlang que una aplicación en particular siempre se debe ejecutar, y si se apaga, reiníciela. ¿Es posible hacer esto?

(No estoy hablando de implementar un supervisor sobre mi aplicación, porque entonces es una trampa 22: ¿qué ocurre si el proceso de mi supervisor se bloquea? Estoy buscando algún tipo de API o configuración que pueda usar para haga que Erlang monitoree y reinicie mi aplicación para mí.)

¡Gracias!

Respuesta

5

Debería poder solucionar esto en el supervisor de nivel superior: establezca la estrategia de reinicio para permitir que un millón se reinicie cada segundo y la aplicación nunca se bloquee. Algo así como:

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

(. Ejemplo adaptado de la OTP Design Principles User Guide)

+0

Genial, muchas gracias por su respuesta. Ahora veo que la razón por la que murió fue porque se alcanzó el límite máximo de reinicio. No obstante, no necesariamente quiero deshabilitar eso, ya que si realmente entra en un ciclo de reinicio, es posible que tengamos que reiniciar toda la aplicación. ¿Hay alguna manera de que reinicie la aplicación si se alcanza el límite de AllowedRestarts/MaxSeconds, en lugar de cerrar la aplicación? – Nick

+1

En el caso que describa, agregará un supervisor a su supervisor. El comportamiento que utiliza OTP es que cuando se envía una señal de salida al proceso que realiza la llamada de inicio a la aplicación (es decir,cuando el supervisor de nivel superior fallece) asume que la aplicación no ha podido corregir el error y que apagará la aplicación y posiblemente el nodo dependiendo de la configuración. Supongo que el punto es que las aplicaciones no deberían bloquearse, y si lo hacen, el error es lo suficientemente grave como para que solo se resuelva con un reinicio del nodo. – Lukas

+0

El enlace es 404 - ¿Alguien tiene una actualización ...? – jisaacstone

4

Puede utilizar heart para reiniciar toda la máquina virtual si se cae, a continuación, utilizar un tipo de aplicación permanente para asegurarse de que la máquina virtual sale cuando tu aplicación sale

En definitiva, necesita algo sobre su aplicación en el que necesite confiar, ya sea un proceso supervisor, la máquina virtual de erlang o algún script de shell que haya escrito; siempre será un problema si también falla.

+0

Bien, gracias. Ese tipo de solución funcionará bien para mí en este caso. Sin embargo, ¿qué sucede si quiero ejecutar más de una aplicación a la vez y hacer que se reinicien de forma independiente según sea necesario? Con todas las funciones de supervisión de procesos sofisticadas que incluye Erlang, me parece sorprendente que parezca que no puedo hacer algo tan simple como reiniciar una aplicación cuando se apaga .... – Nick

3

Use Monit, luego configure su aplicación para terminar utilizando un supervisor para toda la aplicación con una frecuencia de reinicio razonable. Si la aplicación finaliza, la máquina virtual finaliza y monit reinicia todo.

Nunca pude conseguir que Heart sea lo suficientemente confiable, ya que solo reinicia la VM una vez, y no funciona bien con kill -9 de la máquina virtual erlang.

Cuestiones relacionadas