在没有epmd的情况下启动erlang VM



我试图将epmd与erlang vm分开启动,以便对连接处理进行监控。

这很好,除非vm在epmd之前启动。

有没有一种方法可以让erlang vm在不自己启动epmd的情况下启动?

从Erlang/OTP 19.0开始,有一个-start_epmd命令行选项,可以设置为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),则无论-start_epmd设置如何,它都不会启动也不会尝试连接到epmd。

可能有用的问题/答案:

  • 有没有办法阻止Erlang服务器自动启动epmd
  • 确保epmd已启动

因此,根据这些问题/答案,我建议让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启动或运行自己的epmd,如上面的代码中所示)。

希望它能有所帮助!

最新更新