将命令传递给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?的主要内容,如果未能解决你的问题,请参考以下文章

将args通过rebar shell传递给erl?

从 bash 变量为 Erlang erl 传递 -eval 失败

钢筋外壳 - 传递配置文件

`erl -make` 命令是不是可以扩展来执行编译 .erl 文件以外的操作?

ERL:从 shell 执行 erl 命令

Erlang:从命令行调用 erl -eval 永远不会退出