4

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

这工作正常,除了 vm 在 epmd 之前启动的情况。

有没有办法让 erlang vm 在不启动 epmd 的情况下启动它?

4

2 回答 2

3

从 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 节点没有作为分布式节点启动(即不通过-nameor -sname),则无论设置如何,它都不会启动也不会尝试连接到 epmd -start_epmd

于 2017-02-10T10:18:37.477 回答
2

可能有用的问题/答案:

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

希望能帮助到你!

于 2014-02-25T12:36:15.370 回答