我正在尝试将 epmd 与 erlang vm 分开启动,以便对连接处理进行监控。
这工作正常,除了 vm 在 epmd 之前启动的情况。
有没有办法让 erlang vm 在不启动 epmd 的情况下启动它?
从 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 节点没有作为分布式节点启动(即不通过-name
or -sname
),则无论设置如何,它都不会启动也不会尝试连接到 epmd -start_epmd
。
可能有用的问题/答案:
因此,根据这些问题/答案,我建议使 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 启动或运行您自己的启动,如上面的代码)。
希望能帮助到你!