我试图将epmd与erlang分开启动,以便对连接处理进行监视。
这很好,除了当vm在epmd之前启动时。
有没有一种方法可以让erlang在不自行启动epmd的情况下启动?
发布于 2014-02-25 12:36:15
可能有用的问题/答案:
因此,根据这些问题/答案,我建议使erlang服务依赖于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,如上面的代码中所示)。
希望能帮上忙!
发布于 2017-02-10 10:18:37
从Erlang/OTP19.0开始,可以将 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),则无论-start_epmd设置如何,它都不会启动或尝试连接到-start_epmd。
https://stackoverflow.com/questions/21998439
复制相似问题