Frage

Ich lief vor kurzem in einen Bug, bei dem eine ganze Erlang Anwendung starb, eine Log-Nachricht ergeben, dass so aussah:

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

Ich habe keine Ahnung, was diese Abschaltung ausgelöst, aber das eigentliche Problem ist, dass ich es nicht selbst neu gestartet hat. Stattdessen setzte der nun leere Erlang VM nur dort nichts zu tun.

Nun, aus der Forschung, die ich getan habe, es sieht aus wie es andere „Starttypen“ eine Anwendung geben kann. ‚Flüchtig‘ und ‚ständige‘

Wenn ich ein Supervisor starten in eine Anwendung, kann ich es sagen, einen bestimmten Prozess vorübergehend oder permanent zu machen, und es wird automatisch für mich neu zu starten. Doch nach der Dokumentation, wenn ich eine Anwendung machen vorübergehend oder bleibend, ist es nicht neu starten, wenn er stirbt, sondern es tötet alle anderen Anwendungen sowie .

Was ich wirklich tun möchte ist irgendwie die Erlang VM sagen, dass eine bestimmte Anwendung läuft immer sein sollte, und wenn es geht nach unten, starten Sie ihn neu. Ist dies möglich machen?

(Ich spreche nicht einen Supervisor auf meiner Bewerbung über die Implementierung, denn dann ist es ein Catch 22: Was passiert, wenn mein Vorgesetzter Prozess abstürzt, ich bin für eine Art von API oder Einstellung suchen, dass ich verwenden kann, habe Erlang-Monitor und starten Sie meine Anwendung für mich.)

Danke!

War es hilfreich?

Lösung

Es soll möglich sein, dies zu beheben in der Top-Level-Supervisor: Set der Neustart-Strategie eine Million Neustarts pro Sekunde zu ermöglichen, und die Anwendung sollte nie abstürzen. So etwas wie:

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

(Beispiel angepasst von dem OTP-Design-Prinzipien Benutzerhandbuch .)

Andere Tipps

Sie können mit Herz der gesamten VM neu starten, wenn es nach unten geht, dann Gebrauch eine permanente Anwendungsart, um sicherzustellen, dass die VM wird beendet, wenn die Anwendung beendet wird.

Schließlich müssen Sie etwas über Ihre Bewerbung, die Sie vertrauen müssen, ob es sich um ein Überwachungsprozeß ist, die erlang VM oder ein Shell-Skript, das Sie geschrieben -. Es wird immer ein Problem sein, wenn das auch nicht passiert

Verwenden Monit, dann Setup Ihre Anwendung unter Verwendung eines Supervisor für die gesamte Anwendung mit einer angemessenen Anlauffrequenz zu beenden. Wenn die Anwendung beendet wird, werden die VM beendet und neu gestartet wird monit alles.

Ich konnte nie Herz bekommen zuverlässig genug sein, da er nur die VM einmal neu gestartet, und es befasst sich nicht gut mit einem kill -9 der erlang VM.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top