【问题标题】:Erlang remote code loading via erl_boot_server not working通过 erl_boot_server 加载 Erlang 远程代码不起作用
【发布时间】: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 来验证引导加载程序正在读取文件并将其发送给工作人员,并且工作人员没有从磁盘本身加载它们。

标签: erlang elixir


【解决方案1】:

尝试在你的 master 上运行它:

:rpc.call(:'worker', :code, :add_paths, [:code.get_path])

完成后,您应该能够在工作节点上自动加载代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2017-03-01
    相关资源
    最近更新 更多