Ich arbeite durch die Erlang-Dokumentation und versuche, die Grundlagen der Einrichtung eines OTP gen_servers und Supervisors zu verstehen. Immer wenn mein gen_server abstürzt, stürzt auch mein Supervisor ab. Tatsächlich stürzt mein Supervisor immer ab, wenn ich einen Fehler in der Befehlszeile habe.
Ich erwarte, dass der gen_server neu gestartet wird, wenn er abstürzt. Ich erwarte, dass Befehlszeilenfehler auf meinen Server-Komponenten gar nichts haben . Mein Vorgesetzter sollte nicht zusammenstoßen.
Der Code, mit dem ich arbeite, ist ein einfacher "Echo-Server", der mit allem antwortet, was Sie senden, und ein Supervisor, der den echo_server maximal 5 Mal pro Minute startet (one_for_one). Mein Code:
echo_server.erl
%Vor%echo_sup.erl
%Vor% Kompiliert mit erlc *.erl
, und hier ist ein Beispiellauf:
Das Problem beim Testen von Supervisors aus der Shell besteht darin, dass der Supervisor-Prozess mit dem Shell-Prozess verknüpft ist. Wenn der gen_server-Prozess abstürzt, wird das Exit-Signal an die Shell weitergegeben, die abstürzt und neu gestartet wird.
Um das Problem zu vermeiden, fügen Sie dem Supervisor so etwas hinzu:
%Vor%Ich würde vorschlagen, dass Sie Ihre Anwendung debuggen / verfolgen , um zu überprüfen, was vor sich geht. Es ist sehr hilfreich zu verstehen, wie Dinge in OTP funktionieren.
In Ihrem Fall möchten Sie vielleicht Folgendes tun.
Starten Sie den Tracer:
%Vor%Verfolgen Sie alle Funktionsaufrufe für Ihren Supervisor und Ihren gen_server:
%Vor%Überprüfen Sie, welche Nachrichten die Prozesse übergeben:
%Vor%Sehen Sie, was mit Ihren Prozessen passiert (Absturz usw.):
%Vor%Weitere Informationen zur Ablaufverfolgung:
Hoffe, dass dies für diese und zukünftige Situationen helfen kann.
HINWEIS: Das gen_server-Verhalten erwartet, dass der Callback terminate / 2 definiert und exportiert wird;)
UPDATE: Nach der Definition von terminate / 2 ist der Grund des Absturzes aus der Ablaufverfolgung ersichtlich. So sieht es aus:
Wir (75) rufen die Funktion crash / 0 auf. Dies wird vom gen_server (78) empfangen.
%Vor%Uh, Problem beim Handle-Aufruf. Wir haben einen Badmatch ...
%Vor%Die Terminierungsfunktion wird genannt. Der Server wird beendet und die Registrierung wird aufgehoben.
%Vor%Der Supervisor (77) empfängt das Exit-Signal vom gen_server und erledigt seine Aufgabe:
%Vor%Nun, es versucht ... Da passiert was Filippo gesagt hat ...
Wenn andererseits die restart-Strategie in der Konsole getestet werden muss, starten Sie den Supervisor mit der Konsole und überprüfen Sie mit pman, ob der Prozess beendet werden soll.
Sie würden sehen, dass pman mit der gleichen Supervisor-PID aktualisiert wird, aber mit anderen Arbeiter-PIDs, abhängig von MaxR und MaxT, die Sie in der Neustart-Strategie eingestellt haben.
Tags und Links erlang otp supervisor gen-server