Erlang:如何在远程节点上生成的进程中查看io:format / 2调用的输出

时间:2010-04-06 18:07:43

标签: erlang distributed rpc spawn

我正在开发一个分散的Erlang应用程序。我目前正在使用单个PC并通过使用erl标志初始化-sname来创建多个节点。

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

当我使用spawn/4register_name结合远程生成进程时,io:format/2的输出有时会重定向回erl实例,其中远程{{1}调用已经完成,有时仍然完全不可见。

同样,当我使用spawn/4时,rpc:call/4次调用的输出会重定向回io:format/2实例,在该实例中会调用`rpc:call / 4'。

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

3 个答案:

答案 0 :(得分: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进行快速调试。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

示例:假设您已经erl -sname foo运行了erlang节点。比:

$ 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>