我认为escript 可能值得研究。
编辑:
一些例子。
首先是所有示例:以某种方式在某处启动远程节点。
dannib@duval:~:> erl -sname bar
(bar@duval)1> erlang:get_cookie().
'KNKKCFPYMJUPIOLYPOAA'
脚本
1:用内容创建一个名为hello.escript的文件
#!/usr/bin/env escript
%%! -sname foo@duval -setcookie KNKKCFPYMJUPIOLYPOAA
main(_String) ->
Node = 'bar@duval',
Mod = 'erlang',
Fun = 'node',
Args = [],
R = rpc:call(Node, Mod, Fun, Args),
io:format("Hello there ~p~n",[R]).
注意%%! -sname foo@bar 标识主机上的节点(而不是创建nonode@nohost),允许将相同的cookie %%! -sname foo@duvel -setcookie KNKKCFPYMJUPIOLYPOAA 设置为目标主机,这解决了获取{badrpc,nodedown} 的问题。请注意,相同的语句适用于以下示例(erl_call 和 -eval),其中设置了节点名称和 cookie。
2:设置执行位并运行
$ chmod +x hello.escript
$ ./hello.escript
Hello there bar@duval
Erl_call
1:运行
$ erl_call -c 'KNKKCFPYMJUPIOLYPOAA' -a 'erlang node' -n bar@duval
bar@duval
评估
1:运行
$ erl -sname foo -setcookie 'KNKKCFPYMJUPIOLYPOAA'
-eval 'io:format("Hello there ~p~n",[rpc:call(bar@duval,erlang, node, [])])'
... Eshell V5.7.4 (abort with ^G)
(foo@duval)1> Hello there bar@duval
这会创建一个外壳,在这种情况下可能不是您想要的。
我可能会提到,如果两个节点位于同一主机上并使用相同的 cookie 默认值,则不必像示例中那样显式设置 foo 和 bar 的 cookie 值。
在完成这些示例并再次阅读您的问题之后,我认为我给出的糟糕建议将是您的最佳选择,erl_call。我喜欢问题标题中的“复杂”一词,恕我直言,脚本允许以易于阅读的方式进行更多“复杂”设置。 escript 示例中的变量_String 保存脚本的参数,它允许您通过shell 访问输入并在EVM 中执行复杂的erlang 操作。但是,如果您已经在其他应用程序中拥有逻辑并且只需要对 erlang 节点进行这个简单的调用,则 erl_call 可能会更直接。