使用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()"
这个命令会:
- 启动本地
console节点 - 连接到远程
eprocess@$HOSTNAME节点 - 在远程节点执行
MyModule.process() - 执行完成后停止本地节点,自动退出
额外说明
为什么直接用--remsh进入shell后能正常执行?因为进入远程shell后,你的所有命令都是在远程节点的上下文中运行的,远程节点已经加载了Mix项目的所有模块和依赖,所以MyModule是可用的。而-e参数的代码默认是在本地节点执行的,这就是问题的核心区别。
内容的提问来源于stack exchange,提问作者Olshansky
相关产品推荐
相关产品推荐

