Domanda

Recentemente ho imbattuto in un bug in cui è morto un'intera applicazione Erlang, ottenendo un messaggio di log che si presentava così:

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

Non ho idea di che cosa ha innescato questo arresto, ma il vero problema che ho è che non è stato riavviato in sé. Al contrario, l'ormai vuota Erlang VM solo lì seduti senza far nulla.

Ora, dalla ricerca che ho fatto, sembra che ci sono altri "start tipi" si può dare di un'applicazione:. 'Transitoria' e 'permanente'

Se inizio un Supervisore nel di un'applicazione, posso dire che per fare un particolare processo transitoria o permanente, e sarà automaticamente riavviarlo per me. Tuttavia, in base alla documentazione, se faccio un applicazione transitoria o permanente, non si riavvia quando muore, ma piuttosto uccide tutti gli altri applicazioni come bene .

Quello che voglio veramente fare è in qualche modo dire al Erlang VM che una particolare applicazione deve essere sempre in esecuzione, e se va giù, riavviarlo. Questo è possibile fare?

(non sto parlando di attuazione di un supervisore in cima alla mia domanda, perché allora è una cattura 22: che cosa succede se il mio supervisore blocca il processo che sto cercando una sorta di API o l'impostazione che posso usare per avere monitor di Erlang e riavviare la mia domanda per me.)

Grazie!

È stato utile?

Soluzione

Si dovrebbe essere in grado di risolvere questo problema nel supervisore di livello superiore: impostare la strategia di riavvio per consentire un milione di riavvio ogni secondo, e l'applicazione non deve mai bloccarsi. Qualcosa di simile:

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

(esempio tratto dal OTP Guida per l'utente Principi di progettazione .)

Altri suggerimenti

È possibile utilizzare cuore per riavviare l'intera VM se va verso il basso, quindi l'uso un tipo di applicazione permanente per assicurarsi che le uscite VM quando il tuo chiusura dell'applicazione.

In definitiva avete bisogno di qualcosa sopra l'applicazione che avete bisogno di fiducia, se si tratta di un processo di supervisore, l'Erlang VM, o qualche script di shell che hai scritto -. Sarà sempre un problema se ciò accade a fallire anche

Usa Monit, messa a punto quindi l'applicazione per terminare utilizzando un supervisore per l'intera applicazione con una frequenza di riavvio ragionevole. Se i termina di applicazione, i termina VM, e riavvia Monit tutto.

Non potrei mai cuore di essere abbastanza affidabili, come si riavvia solo il VM una volta, e non si tratta bene con un kill -9 del Erlang VM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top