将命令传递给erl?
Posted
技术标签:
【中文标题】将命令传递给erl?【英文标题】:Passing command to erl? 【发布时间】:2012-04-15 11:41:40 【问题描述】:我们正在运行一个 erlang 程序 (ejabberd)。有时,我们需要通过将 erl shell 连接到这个正在运行的 erlang 程序来进行健康检查。
我正在尝试编写所有这些脚本,而不是键入 erl -sname r -remsh ....
然后在 erlang shell 中输入我的命令,我正在寻找直接从我的 bash shell 执行该命令并获取输出的方法。这可能吗?
在Odobenus的回答之后,我写了这个小脚本:
#!/usr/bin/env escript
%%! -sname r -setcookie `cat ~ejabberd/.erlang.cookie`
main([]) ->
Res = rpc:call(ejabberd@xmpp,mnesia,info,[]),
io:format("~p~n",[Res]).
问题是我收到“节点关闭”错误,尽管这些参数与我用来连接 erl
:erl -sname r -remsh ejabberd@xmpp -setcookie `cat ~ejabberd/.erlang.cookie`
的参数完全相同
【问题讨论】:
【参考方案1】:问题出在 -sname 参数中。使用全名 -name node@host 一切都会正常
【讨论】:
【参考方案2】:你可以为此编写 escript http://www.erlang.org/doc/man/escript.html
种类(例如 tst.erl)
#!/usr/bin/env escript
%%! -sname r
main([Cookie]) ->
erlang:set_cookie(node(),list_to_atom(Cookie)),
Res = rpc:call(name@somenode,somemodule,somefunction,[]),
io:format("~p~n",[Res]).
并从 bash 脚本中调用它
./tst.erl `cat verythatfile`
【讨论】:
不幸的是,我确实收到了badrpc,nodedown
。问题是当我与 erl 连接时,我使用 remsh,我似乎无法用 escript 来做。有什么想法吗?
nodedown 表示 escript 看不到您的服务器。您是否设置了相同的 cookie?
当,我的 cat ~ejabberd/.erlang.cookie
在 thge %% 行中失败。手动输入它可以解决这个问题......但是最好避免这种情况。有什么线索吗?以上是关于将命令传递给erl?的主要内容,如果未能解决你的问题,请参考以下文章
从 bash 变量为 Erlang erl 传递 -eval 失败