在没有 epmd 的情况下启动 erlang VM
Posted
技术标签:
【中文标题】在没有 epmd 的情况下启动 erlang VM【英文标题】:Starting the erlang VM without epmd 【发布时间】:2014-03-26 17:54:07 【问题描述】:我正在尝试将 epmd 与 erlang vm 分开启动,以便对连接处理进行监控。
这很好用,除了 vm 在 epmd 之前启动的情况。
有没有办法让 erlang vm 在不自行启动 epmd 的情况下启动?
【问题讨论】:
【参考方案1】:从 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
),则无论 -start_epmd
设置如何,它都不会启动或尝试连接到 epmd。
【讨论】:
【参考方案2】:可能有帮助的问题/答案:
Is there a way to stop Erlang servers from automatically starting epmd? Ensure epmd started因此,根据这些问题/答案,我建议使 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 的情况下启动 erlang VM的主要内容,如果未能解决你的问题,请参考以下文章
Erlang EPMD 使用非默认 EPMD 端口连接到其他主机