2010-01-25 9 views
5

Neben der Ausführung von $ killall -9 beam.smp, wie kann ich einen Erlang-Knoten programmgesteuert beenden, wenn ich seine -sname kenne?Stoppen Erlang Daemon

Wenn ich nicht möchte, dass der Heartbeat-Monitor den Prozess neu startet, wie kann ich sicherstellen, dass die Antwort auf die obige Frage auch den Herzschlag beendet?

Gibt es eine gute Anleitung, um Erlang als Daemon einzusetzen?

Antwort

10

kill und killall mit ist fast immer falsch.

Sie können ganz einfach fragen den entfernten Knoten mit verlassen:

rpc:call(RemoteNode, init, stop, []). 

Ich weiß nicht, ob, dass es heart einen Neustart verhindern würde, aber ich würde vorschlagen, dass, wenn Sie erwarten, dass es zu stoppen , sollten Sie es nicht in einem nicht-immer-stoppen-Modus ausführen.

aktualisieren - Zed weist darauf hin, dass init:stop das Richtige tut mit heart, so dass die obige rpc:call ist die beste und einzige Weg, es zu tun.

+3

"init: stop(): ... Wenn das Befehlszeilenargument" heart "angegeben wurde, wird das Herzprogramm beendet, bevor der Erlang-Knoten beendet wird." – Zed

+1

Ich denke, dass meine Knoten nicht richtig verbunden sind. Ich bin mir sicher, dass ich etwas übersehen habe. Um zu testen, öffnete ich zwei Terminal-Fenster und führte 'erl -sname foo' in einem aus, dann holte ich den Cookie heraus und führte 'erl -sname bar -setcookie' ... '. In diesem Fenster habe ich 'net_adm: ping ('foo @ elife')' 'ausgeführt, aber es hat mir einen 'Pang' gegeben. Ich habe einige Varianten ausprobiert, alles ohne Glück. Irgendeine Idee, was ich falsch mache? – Eli

+0

Warum machst du 'Setcookie' auf der einen und nicht auf der anderen? Wenn sie nicht übereinstimmen, können Sie nicht sprechen. Im Allgemeinen benutze ich '~/.erlang.cookie' auf meinem lokalen Knoten. – Dustin