You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用iex -e参数远程调用Elixir模块时提示模块不可用的问题

解决远程连接iex时-e参数无法访问模块的问题

这个问题我之前踩过坑!原因很简单:当你在iex命令里同时使用--remsh和-e时,-e指定的代码会先在本地启动的节点上执行,而不是直接在你要远程连接的节点上运行。你的本地console节点没有加载MyModule相关的代码和Mix依赖,自然会报找不到模块的错误。

下面给你两种可行的解决方案:

方案1:用:rpc.call/4在远程节点执行函数

直接通过Erlang的RPC机制,把函数调用发送到目标远程节点执行。修改后的命令如下:

iex --sname console --remsh eprocess@$HOSTNAME -e ":rpc.call(:'eprocess@$HOSTNAME', MyModule, :process, [])"
  • :'eprocess@$HOSTNAME'是要调用的远程节点名称(注意原子格式的写法)
  • MyModule是目标模块名,:process是函数名,[]是函数的参数列表(因为你的process/0没有参数,所以是空列表)

执行这个命令后,-e的代码会在本地节点发起RPC调用,让远程节点执行MyModule.process(),这样就能成功调用到已经在远程节点加载好的模块了。

方案2:直接连接节点并调用(无需--remsh)

如果你不需要进入远程shell,只是想执行完函数就退出,可以去掉--remsh,改用Node.connect/1连接节点,再通过RPC调用函数,最后退出本地节点:

iex --sname console -e "Node.connect(:'eprocess@$HOSTNAME'); :rpc.call(:'eprocess@$HOSTNAME', MyModule, :process, []); :init.stop()"

这个命令会:

  1. 启动本地console节点
  2. 连接到远程eprocess@$HOSTNAME节点
  3. 在远程节点执行MyModule.process()
  4. 执行完成后停止本地节点,自动退出

额外说明

为什么直接用--remsh进入shell后能正常执行?因为进入远程shell后,你的所有命令都是在远程节点的上下文中运行的,远程节点已经加载了Mix项目的所有模块和依赖,所以MyModule是可用的。而-e参数的代码默认是在本地节点执行的,这就是问题的核心区别。

内容的提问来源于stack exchange,提问作者Olshansky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:07:38