【问题标题】:Erlang: How to view output of io:format/2 calls in processes spawned on remote nodesErlang:如何在远程节点上产生的进程中查看 io:format/2 调用的输出
【发布时间】:2011-02-04 22:37:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: erlang distributed rpc spawn


    【解决方案1】:

    查看我的answer提问Erlang : RPC to a node with output on that node了解如何实现输出到不同地方的一些细节。没有提到,即使在运行 shell 中也可以运行远程 shell。只需按Ctrl+G^G 启动提示),然后在h 下获得帮助(按hEnter)。

    示例:假设您通过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>
    

    【讨论】:

      【解决方案2】:

      您可以使用来自第一个节点的 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 用于快速调试。

      【讨论】:

      • 谢谢,我会自己尝试一下,看看它是否有效。不过,可能要过几天我才能重新审视这个问题。我很好奇,这是常识吗?我花了几个小时在 Google 上搜索并在 #erlang 中提问,但还没有遇到这个解决方案。
      • 不,它是通过挫折密集的过程获得的。 Io 子系统在很长一段时间内都没有记录,直到最近。不客气!
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        • 2012-09-08
        相关资源
        最近更新 更多