查看源代码 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
。但是,对于未指定的Fun
和Args
,则假定为start
和[]
。Args
的格式应与erlang:apply/3
在ERTS
中的格式相同,但只允许使用所有术语的一个子集。允许的术语类型为:list
(以及列表的string
表示形式,即“example”)、tuple
、atom
和number
。请注意,此标志正好需要一个参数,因此可能需要引用,以按照命令 shell 的行为方式对
Mod
、Fun
和Args
进行分组。-address [Hostname:]Port
- (必须是-n
、-name
、-sname
或-address
中的一个。)Hostname
是正在运行erl_call
将与之通信的对等节点的机器的主机名。默认主机名是本地机器的主机名。Port
是erl_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