在没有 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 端口连接到其他主机

具有非默认 EPMD 端口的 Erlang 节点不再响应 ping

Erlang EPMD

Erlang epmd官方文档中文翻译

从二进制安装 Erlang 和 epmd 具有循环依赖关系

Erlang epmd 问题 - RabbitMQ 和 Ejabberd 在同一主机上