我需要从unix shell运行复杂的erlang模块函数
rpc:call('node@example.com',mnesia,dirty_first,[mytable])
我该怎么做?
UPD:
我做test.escript
chmod x test.escript
#!/usr/lib64/erlang/bin/escript %%! -name 'test@example.com' main(_Args) -> R = rpc:call('node@example.com',[mytable]),io:format("~p~n",[R]).
并收到{badrpc,nodedown}
但是跑的时候
erl -name test@example.com 1> rpc:call('node@example.com',[mytable]). {my,data}.
我的意思是它有效,但如何使escript工作真正的?
我认为
escript可能值得一试.
原文链接:https://www.f2er.com/bash/387160.html编辑:
一些例子.
首先是所有示例:以某种方式在某处启动远程节点.
dannib@duval:~:> erl -sname bar (bar@duval)1> erlang:get_cookie(). 'KNKkcfPYMJUPIOLYPOAA'
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
EVAL
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
这会创建一个shell,在这种情况下可能不是你想要的.
我可能会提到,如果两个节点都在同一主机上并使用相同的cookie默认值,则不必像示例中那样显式设置foo和bar的cookie值.
在做完这些例子并再次阅读你的问题之后,我认为我提出的可行建议将是你最好的选择,erl_call.我对“问题”中的“复杂”这个词感到沮丧,其中imho escripts以易于阅读的方式允许更多“复杂”的设置. escript示例中的变量_String保存脚本的参数,允许您通过shell访问输入并在EVM中执行复杂的erlang操作.但是如果你已经在其他应用程序中拥有逻辑并且只需要对erlang节点进行这种简单调用,那么erl_call可能会更直接.