查看源代码 erl_call

调用/启动一个分布式 Erlang 节点。

描述

erl_call 使得启动和/或与分布式 Erlang 节点通信成为可能。它基于 Erl_Interface 库构建,作为一个示例应用程序。它的目的是使用 Unix shell 脚本与分布式 Erlang 节点交互。它使用标准的 Erlang RPC 工具,与 Erlang *rex 服务器*执行所有通信。它不需要在 Erlang 目标节点上运行任何特殊软件。

主要用途是启动一个分布式 Erlang 节点或进行一个普通的函数调用。但是,也可以将 Erlang 模块管道传输到 erl_call 并进行编译,或管道传输一系列要评估的 Erlang 表达式(类似于 Erlang shell)。

可以充分利用导致读取 stdin 的选项,将其作为 (Unix) shell 脚本中的脚本。 erl_call 的另一个不错的用途可能是来自 (HTTP) CGI-bin 脚本。

erl_call <选项>

启动/调用 Erlang。

每个选项标志都在下面描述,包括其名称、类型和含义。

  • -a [Mod [Fun [Args]]]] - (*可选的。*)应用指定的函数并返回结果。必须指定 Mod。但是,对于未指定的 FunArgs,则假定为 start[]Args 的格式应与 erlang:apply/3ERTS 中的格式相同,但只允许使用所有术语的一个子集。允许的术语类型为:list(以及列表的 string 表示形式,即“example”)、tupleatomnumber

    请注意,此标志正好需要一个参数,因此可能需要引用,以按照命令 shell 的行为方式对 ModFunArgs 进行分组。

  • -address [Hostname:]Port - (必须是 -n-name-sname-address 中的一个。)Hostname 是正在运行 erl_call 将与之通信的对等节点的机器的主机名。默认主机名是本地机器的主机名。Porterl_call 将与之通信的节点的端口号。 -address 标志不能与 -n-name-sname-s 标志组合使用。

    当想要调用在没有可访问的 epmd 实例的机器上运行的节点时,-address 标志通常很有用。

  • -c Cookie - (*可选的。*)使用此选项指定特定的 Cookie。如果未指定 Cookie,则会读取 ~/.erlang.cookie 文件,并且其内容将用作 Cookie。我们要与之通信的 Erlang 节点必须具有相同的 Cookie。

  • -d - (*可选的。*)调试模式。这将导致所有 I/O 输出到 ~/.erl_call.out.Nodename 文件,其中 Nodename 是相关 Erlang 节点的节点名称。

  • -e - (*可选的。*)从 stdin 读取一系列 Erlang 表达式,以逗号 (,) 分隔并以句点 (.) 结尾,直到 EOF (Control-D)。计算表达式并返回最后一个表达式的结果。成功时返回 {ok,Result}

  • -fetch_stdout - (*可选的。*)在新进程中执行使用 -a-e 选项指定的代码,该进程具有一个 组长,该组长会转发所有标准输出(标准输出)数据,以便将其打印到 erl_call 进程的标准输出。这意味着在执行调用的代码期间,由代码和后代进程写入的标准输出数据将被转发(前提是组长没有通过调用 erlang:group_leader/2 进行更改)。

    打印的数据采用 UTF-8 编码。

    此选项仅与 -a-e 选项结合使用时才相关。

    有关组长概念的更多信息,请参见 I/O 协议的文档。

    注意

    仅当 erl_call 与版本大于或等于 OTP-24 的节点交互时,此选项才有效。

  • -h HiddenName - (*可选的。*)指定 erl_call 所代表的隐藏节点的名称。

  • -m - (*可选的。*)从 stdin 读取 Erlang 模块并进行编译。

  • -n Node - (必须是 -n-name-sname-address 中的一个。)与 -name 含义相同,仍然可以出于向后兼容的原因使用。

  • -name Node - (必须是 -n-name-sname-address 中的一个。)Node 是要启动或与之通信的对等节点的名称。假定 Node 是使用 erl -name 启动的,这意味着使用完全限定的长节点名称。如果指定了 -s 选项,则 Erlang 节点将(如果需要)使用 erl -name 启动。

  • -no_result_term - (*可选的。*)不打印结果术语。此选项仅与 -a-e 选项一起使用时才相关。

  • -q - (*可选的。*)停止使用开关 -n 指定的 Erlang 节点。此开关会覆盖开关 -s

  • -r - (*可选的。*)为 erl_call 所代表的隐藏节点生成随机名称。

  • -R - (*可选的。*)从对等节点请求 erl_call 所代表的隐藏节点的动态随机名称。自 OTP 23 起受支持。当对同一对等节点进行重复请求时,建议使用 -R 而不是 -r

  • -s - (*可选的。*)如果需要,则启动一个分布式 Erlang 节点。这意味着在一系列调用中,其中“-s”和“-n Node”是恒定的,则只有第一个调用才会启动 Erlang 节点。这使得其余的通信非常快速。此标志当前仅在类 Unix 平台(Linux、Mac OS X、Solaris 等)上可用。

  • -sname Node - (必须是 -n-name-sname-address 中的一个。)Node 是要启动或与之通信的对等节点的名称。假定 Node 是使用 erl -sname 启动的,这意味着使用短节点名称。如果指定了 -s 选项,则 Erlang 节点将使用 erl -sname 启动(如果需要)。

  • -timeout Seconds - (*可选的。*)在超时到期后中止 erl_call 进程。请注意,这不会中止已使用 -a-e 或类似方式启动的命令。

  • -v - (*可选的。*)打印大量 verbose 信息。这仅对 erl_call 的开发人员和维护人员有用。

  • -x ErlScript - (*可选的。*)指定要使用的 Erlang 启动脚本的另一个名称。如果未指定,则使用标准的 erl 启动脚本。

示例

启动 Erlang 节点并调用 erlang:time/0

erl_call -s -a 'erlang time' -n madonna
{18,27,34}

通过调用 erlang:halt/0 终止 Erlang 节点

erl_call -s -a 'erlang halt' -n madonna

使用多个参数进行应用

erl_call -s -a 'lists seq [1,10]' -n madonna

评估一些表达式(*输入以 EOF (Control-D) 结尾*)

erl_call -s -e -n madonna
statistics(runtime),
X=1,
Y=2,
{_,T}=statistics(runtime),
{X+Y,T}.
^D
{ok,{3,0}}

编译一个模块并运行它(*同样,输入以 EOF (Control-D) 结尾*)

(在示例中,输出已在事后格式化。)

erl_call -s -m -a procnames -n madonna
-module(procnames).
-compile(export_all).
start() ->
        P = processes(),
        F = fun(X) -> {X,process_info(X,registered_name)} end,
        lists:map(F,[],P).
^D
[{<[email protected],0,0>,
                  {registered_name,init}},
 {<[email protected],2,0>,
                  {registered_name,erl_prim_loader}},
 {<[email protected],4,0>,
                  {registered_name,error_logger}},
 {<[email protected],5,0>,
                  {registered_name,application_controller}},
 {<[email protected],6,0>,
                  {registered_name,kernel}},
 {<[email protected],7,0>,
                  []},
 {<[email protected],8,0>,
                  {registered_name,kernel_sup}},
 {<[email protected],9,0>,
                  {registered_name,net_sup}},
 {<[email protected],10,0>,
                  {registered_name,net_kernel}},
 {<[email protected],11,0>,
                  []},
 {<[email protected],12,0>,
                  {registered_name,global_name_server}},
 {<[email protected],13,0>,
                  {registered_name,auth}},
 {<[email protected],14,0>,
                  {registered_name,rex}},
 {<[email protected],15,0>,
                  []},
 {<[email protected],16,0>,
                  {registered_name,file_server}},
 {<[email protected],17,0>,
                  {registered_name,code_server}},
 {<[email protected],20,0>,
                  {registered_name,user}},
 {<[email protected],38,0>,
                  []}]

转发标准输出而不打印结果术语(*同样,输入以 EOF (Control-D) 结尾*)

erl_call -s -e -sname madonna -fetch_stdout -no_result_term
io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
^D
Number of schedulers: 8
Number of logical cores: 8