停止Erlang守护进程

6
除了运行$ killall -9 beam.smp,当我知道它的-sname时,如何以编程方式杀死Erlang节点?
如果我不希望心跳监视器重新启动进程,如何确保对上述问题给出的任何答案也会杀死心跳?
是否有一个良好的指南来部署Erlang作为守护程序?
1个回答

10

killkillall使用-9几乎总是错误的。

您可以很容易地使用以下命令请求远程节点退出:

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

我不知道那是否会阻止heart重新启动它,但如果您希望停止它,则不应以永不停止的模式运行它。

更新 - Zed指出init:stopheart执行正确操作,因此上面的rpc:call是最佳且唯一的方法来完成这个任务。


3
"init:stop(): ... 如果使用了-heart命令行参数,那么在Erlang节点终止之前,heart程序将被终止。..." - Zed
1
我认为我的节点没有完全连接。我确定我忽略了某些东西。为了测试,我打开了两个终端窗口并在其中一个中运行了 erl -sname foo,然后从中获取了 cookie 并运行了 erl -sname bar -setcookie '...'。在这个窗口中,我运行了 net_adm:ping('foo@elife'),但它给了我一个 'pang'。我尝试了一些变体,都没有成功。你有什么想法我做错了什么吗? - Eli
为什么你在一个上使用了-setcookie而在另一个上没有使用?如果它们不匹配,就无法通信。通常情况下,我只在本地节点上使用~/.erlang.cookie - Dustin
我将它们都设置为使用相同的cookie,但仍然没有通信。有什么想法吗? - Eli
可能有很多原因。但你应该确保它能够正常工作。这是另一个问题,或者需要更多的文档支持。你可以尝试使用-name something@127.0.0.1,这应该可以解决问题。 - Dustin
你正在使用OS X吗?如果是的话,这也可能是你的问题:https://dev59.com/5EvSa4cB1Zd3GeqPfY5P - Adam Lindberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接