【发布时间】:2021-06-02 21:40:51
【问题描述】:
我正在通过 -loader inet 选项测试 erlang 远程代码加载,不带 slave 选项。
目前在同一个盒子上有两个 elixir 模拟器(控制台)。运行自定义项目的大师:
大师
shell> iex --sname master --cookie abc123 -S mix
master iex> :erl_boot_server.start([{127,0,0,1}])
{:ok, #PID<0.134.0>}
另一个裸奔:
工人
shell> iex --sname worker --cookie abc123 --erl "-hosts 127.0.0.1 -id worker -loader inet"
worker iex>
自动远程代码加载究竟是如何工作的?当我尝试在工作人员上加载模块时,我得到:
worker iex> Code.ensure_loaded(MyModule)
{:error, :nofile}
在 master 上这确实有效:
master iex> Code.ensure_loaded(MyModule)
{:module, MyModule}
我知道工作节点确实找到了主节点并连接到它的引导服务器,因为当主节点不存在时,我会收到消息:
{erl_prim_loader,'no server found'}
我还尝试通过 Code.append_path 将所有代码路径添加到工作程序,但是当我尝试加载模块时仍然找不到它。
【问题讨论】:
-
我认为如果在工作人员上调用类似
Code.ensure_loaded(:myModule)的名称,即使用模块名称的原子形式,它会起作用。 -
@SteveVinoski 我现在已经尝试过了,全名也是:“Elixir.MyModule”。未找到文件的相同结果。感谢您的建议。
-
奇怪。除了
-S mix选项之外,我运行了与您相同的命令,并且可以使用原子模块名称加载模块。我什至在我的 Mac 上运行dtruss来验证引导加载程序正在读取文件并将其发送给工作人员,并且工作人员没有从磁盘本身加载它们。