跨机器Erlang节点net_adm:ping返回pang问题排查求助
解决Erlang分布式节点
net_adm:ping返回pang的问题 我之前也踩过Erlang分布式节点互通的坑,结合你描述的情况(树莓派和Windows能双向ping通,但跨机net_adm:ping失败,同机Shell正常),给你梳理几个关键的排查和解决方向:
确保节点配置完全一致
- 首先检查Erlang节点的cookie:这是分布式通信的核心验证密钥,大小写敏感。
- 在两端Shell分别执行
erlang:get_cookie().,确认返回的原子完全相同。 - 如果不一致,启动节点时通过
erl -setcookie 你的自定义cookie指定,或者在运行中的Shell用erlang:set_cookie(node(), 你的自定义cookie).临时修正。
- 在两端Shell分别执行
- 节点名称格式要正确:必须是
节点名@主机IP/主机名的形式,比如树莓派启动节点:erl -name pi@192.168.1.105 -setcookie my_file_server,Windows端启动:erl -name desktop@192.168.1.20 -setcookie my_file_server。
- 首先检查Erlang节点的cookie:这是分布式通信的核心验证密钥,大小写敏感。
验证网络端口连通性
- Erlang分布式依赖两个关键部分:epmd服务(默认4369端口)和动态通信端口。
- 先测试4369端口:Windows端用PowerShell执行
Test-NetConnection 树莓派IP -Port 4369,树莓派端用telnet WindowsIP 4369或者nc -zv WindowsIP 4369,确认端口能连通。 - 如果4369不通,检查两端epmd是否运行:Erlang节点启动时会自动拉起epmd,也可以手动执行
epmd -daemon启动后台服务。 - 动态端口拦截:如果4369通了还是失败,可能是防火墙拦截了动态端口。可以临时关闭两端防火墙测试(仅限排查),或者通过设置
ERL_EPMD_PORT环境变量固定端口范围,再配置防火墙规则放行。
- 先测试4369端口:Windows端用PowerShell执行
- Erlang分布式依赖两个关键部分:epmd服务(默认4369端口)和动态通信端口。
排查主机名解析问题
- Erlang节点有时会依赖主机名解析而非直接IP,检查两端的hosts文件:
- Windows的hosts路径:
C:\Windows\System32\drivers\etc\hosts,添加一行树莓派IP pi-node; - 树莓派的hosts路径:
/etc/hosts,添加一行WindowsIP desktop-node; - 测试解析:两端分别ping对方的主机名,确保能解析到正确IP。
- Windows的hosts路径:
- Erlang节点有时会依赖主机名解析而非直接IP,检查两端的hosts文件:
检查Erlang版本兼容性
- 尽量保证两端Erlang版本一致,大版本差异(比如Erlang/OTP 23和26)可能导致分布式协议不兼容。执行
erl -version查看版本,若差异较大建议升级或降级到同一版本。
- 尽量保证两端Erlang版本一致,大版本差异(比如Erlang/OTP 23和26)可能导致分布式协议不兼容。执行
统一节点启动方式
- 启动节点时要统一使用
-name(长名称,基于完整主机名/IP)或-sname(短名称,仅限本地局域网主机名),不能一端用-name另一端用-sname,否则会无法识别节点。
- 启动节点时要统一使用
内容的提问来源于stack exchange,提问作者AkRk
相关产品推荐
相关产品推荐

