使用rebar3时Erlang的Kernel参数inet_dist_listen_min不生效问题
解决rebar3 shell下inet_dist_listen_min/max参数不生效的问题
问题根源
rebar3 shell的启动流程和直接用erl命令不同:它会先完成Erlang节点的初始化(包括分布式监听端口的分配),之后才加载sys.config里的kernel参数。而inet_dist_listen_min和inet_dist_listen_max是节点启动阶段的核心参数,必须在节点初始化前传入才能生效,这就导致配置文件里的参数加载时机太晚,没起到作用。
解决方法
方法1:通过vm.args提前传入参数(长期配置)
- 在项目根目录的
config文件夹下新建或编辑vm.args文件,添加以下内容:
-kernel inet_dist_listen_min 25672 -kernel inet_dist_listen_max 25680
- 在
rebar.config中添加配置,让rebar3启动时读取这个vm.args文件:
{vm_args, "config/vm.args"}.
之后再用rebar3 shell --sname apple启动,节点初始化时就会读取这些参数,端口会被限制在指定范围内。
方法2:启动时直接传入参数(临时测试)
如果只是临时验证,不用修改配置文件,启动时通过--erl参数直接把参数传给Erlang虚拟机:
rebar3 shell --sname apple --erl "-kernel inet_dist_listen_min 25672 inet_dist_listen_max 25680"
验证方式
启动节点后,可以用两种方式确认端口是否生效:
- 在Erlang shell里执行
inet:i().,查看输出中tcp类型的监听端口,确认是否在25672-25680区间内。 - 用系统命令检查(以Linux为例):
ss -tulpn | grep beam.smp
找到对应beam进程的监听端口,确认范围正确。
内容的提问来源于stack exchange,提问作者孙海城
相关产品推荐
相关产品推荐

