我正在尝试与erlang vm分别启动epmd,以便对连接处理进行监控。
这种方法很好,除了vm在epmd之前启动的情况。
有没有办法让erlang vm启动而不启动它自己的epmd?
答案 0 :(得分:2)
从Erlang / OTP 19.0开始,a -start_epmd
command line option可以设置为true
(默认值)或false
。
如果在命令行上传递-start_epmd false
并且epmd正在运行,则Erlang节点将照常启动。如果epmd未运行,则Erlang节点无法以此消息开头:
$ erl -start_epmd false -sname foo
Protocol 'inet_tcp': register/listen error: econnrefused
如果Erlang节点没有作为分布式节点启动(即没有通过-name
或-sname
),它既不会启动也不会尝试连接到epmd,无论-start_epmd
如何设置。
答案 1 :(得分:1)
可能有用的问题/答案:
因此,与这些问题/答案一致,我建议让erlang vm服务依赖于epmd(它本身应该是另一个服务)。此外,如果您将epmd作为最先运行的服务之一运行,则应该可以在每次erlang之前启动它。但是如何做到这一点实际上取决于您的操作系统和部署实现细节。
另外,一个不那么优雅的解决方案是更改你的init脚本,所以它会等待epmd启动,但需要手动启动。你的里程可能会有所不同,而且一种非常天真的方法(但作为一个例子很有用)就像是:
while [ true ]; do
pid=`pidof epmd`;
if [ "$pid" == "" ]; then
sleep 1; # Wait a bit more
else
break;
fi
done
# Continue initialization
请注意,代码应考虑最大尝试次数,pidof仅适用于Linux等。不确定我喜欢这个解决方案,但可以完成这项工作。
作为不那么优雅的解决方案,你可以用你自己的二进制代替erlang运行的epmd,它可以满足你的需要(比如伪造epmd开始或运行你自己的,就像上面的代码一样)。 p>
希望它有所帮助!