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

时间:2014-02-24 20:35:18

标签: erlang epmd

我正在尝试与erlang vm分别启动epmd,以便对连接处理进行监控。

这种方法很好,除了vm在epmd之前启动的情况。

有没有办法让erlang vm启动而不启动它自己的epmd?

2 个答案:

答案 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>

希望它有所帮助!