4

我正在开发一个去中心化的 Erlang 应用程序。我目前正在一台 PC 上工作,并通过erl使用-sname标志进行初始化来创建多个节点。

当我在其主节点上使用生成进程时,我可以在其主实例spawn/4中看到该进程内的调用生成的输出。io:format/2erl

当我通过spawn/4结合使用远程生成一个进程时register_name,输出io:format/2有时会重定向回进行erl远程调用的实例spawn/4,有时仍然完全不可见。

同样,当我使用 时rpc:call/4,调用的输出io:format/2被重定向回调用erl`rpc:call/4' 的实例。

如何让进程将调试输出发送回其父erl实例?

4

3 回答 3

7

您可以使用来自第一个节点的 erlang:group_leader() 的结果为第二个节点上的 io:format/3 提供第一个参数。

启动第一个节点,全局注册本地 shell 进程组负责人:

erl -sname a
(a@localhost)1> global:register_name(global_io_srv, group_leader()).
yes

启动第二个节点,连接,使用全局注册的进程作为 io 设备

erl -sname b
(b@localhost)1> net_kernel:connect(a@localhost).
true
(b@localhost)2> io:format(global:whereis_name(global_io_srv),"test output",[]).
ok

您将在第一个节点中看到测试输出。这与克里斯蒂安建议的方式相同,只是更明确一点。因此,您可以将 error_logger 用于生产日志记录,并将 io:format/3 用于快速调试。

于 2010-04-06T20:02:20.397 回答
4

您所看到的是其组长设置为生成它们的节点上的 pid 的进程。见erlang:group_leader。组长是他们将输出发送到的地方。

您将此输出称为“调试输出”,因此您确定不想在节点上启动 sasl 应用程序并使用error_logger吗?

于 2010-04-06T19:20:31.770 回答
3

有关如何实现输出到不同地方的一些详细信息,请参阅我对Erlang 问题的回答:RPC to a node with output on that node 。没有提到,即使在运行 shell 中也可以运行远程 shell。只需按Ctrl+G(启动时提示),然后在(按和比)^G下获得帮助。hhEnter

示例:假设您运行 erlang node by erl -sname foo。比:

$ erl -sname bar
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5  (abort with ^G)
(bar@hynek-notebook)1>
User switch command
 --> r 'foo@hynek-notebook'
 --> j
   1  {shell,start,[init]}
   2* {'foo@hynek-notebook',shell,start,[]}
 --> h
  c [nn]            - connect to job
  i [nn]            - interrupt job
  k [nn]            - kill job
  j                 - list all jobs
  s [shell]         - start local shell
  r [node [shell]]  - start remote shell
  q        - quit erlang
  ? | h             - this message
 --> c
Eshell V5.7.5  (abort with ^G)
(foo@hynek-notebook)1>
于 2010-04-07T06:41:41.390 回答