Frage Erlang-Anwendungen automatisch neu starten


Ich bin kürzlich auf einen Fehler gestoßen, bei dem eine ganze Erlang-Anwendung abgestorben ist, was zu einer Protokollmeldung führte, die folgendermaßen aussah:

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

Ich habe keine Ahnung, was dieses Herunterfahren ausgelöst hat, aber das eigentliche Problem ist, dass es sich nicht selbst neu gestartet hat. Stattdessen saß die jetzt leere Erlang-VM einfach da und tat nichts.

Nun, von den Recherchen, die ich gemacht habe, sieht es so aus, als ob es noch andere "Starttypen" gibt, denen Sie eine Anwendung geben können: "transient" und "permanent".

Wenn ich einen Supervisor starte innerhalb eine Anwendung, kann ich sagen, es zu machen bestimmter Prozess vorübergehend oder permanent, und es wird es automatisch für mich neu starten. Jedoch, nach der Dokumentation, wenn ich ein Anwendung vorübergehend oder dauerhaft, es startet es nicht neu, wenn es stirbt, sondern es tötet es All die anderen Anwendungen auch.

Was ich wirklich tun möchte, ist, der Erlang-VM zu sagen, dass eine bestimmte Anwendung immer ausgeführt werden sollte, und wenn sie ausfällt, starte sie neu. Ist das möglich?

(Ich spreche nicht über die Implementierung eines Supervisors auf meiner Anwendung, denn dann ist es ein Haken 22: Was passiert, wenn mein Supervisor-Prozess abstürzt? Ich suche nach einer Art von API oder Einstellung, die ich verwenden kann, um Erlang Monitor und starte meine Bewerbung für mich neu.)

Vielen Dank!


5
2018-06-16 15:18


Ursprung


Antworten:


Sie sollten dies im Supervisor der obersten Ebene beheben können: Legen Sie die Neustartstrategie so fest, dass jede Sekunde eine Million Neustarts möglich ist, und die Anwendung sollte niemals abstürzen. Etwas wie:

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

(Beispiel angepasst von der OTP Design Principles Benutzerhandbuch.)


4
2018-06-16 16:51



Sie können verwenden Herz Um die gesamte VM neu zu starten, wenn sie ausfällt, verwenden Sie einen permanenten Anwendungstyp, um sicherzustellen, dass die VM beendet wird, wenn Ihre Anwendung beendet wird.

Schließlich brauchen Sie etwas über Ihrer Anwendung, dem Sie vertrauen müssen, ob es sich um einen Supervisor-Prozess, die erlang-VM oder ein Shell-Skript handelt, das Sie geschrieben haben - es wird immer ein Problem sein, wenn das auch scheitert.


5
2018-06-16 18:57



Verwenden Sie Monit und richten Sie dann Ihre Anwendung so ein, dass sie beendet wird, indem Sie einen Supervisor für die gesamte Anwendung mit einer angemessenen Neustartfrequenz verwenden. Wenn die Anwendung beendet wird, wird die VM beendet und monit startet alles neu.

Ich könnte niemals Heart dazu bringen, zuverlässig genug zu sein, da es die VM nur einmal neu startet und es sich nicht gut mit einem kill -9 der erlang VM verhält.


4
2018-06-17 13:33