代码之家  ›  专栏  ›  技术社区  ›  jkndrkn

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

  •  4
  • jkndrkn  · 技术社区  · 14 年前

    erl -sname 旗帜。

    当我使用 spawn/4 在其主节点上,我可以看到由调用生成的输出 io:format/2 在这个过程中 厄尔 实例。

    register_name ,输出 io:格式/2 有时会重定向回 厄尔 远程 繁殖/4 有人打过电话,有时完全看不见。

    同样,当我使用 rpc:call/4 呼叫被重定向回 实例,其中`rpc:call/4“打电话了。

    厄尔

    3 回复  |  直到 14 年前
        1
  •  7
  •   probsolver    14 年前

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

    启动第一个节点,全局注册本地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\u logger进行生产日志记录,并使用io:format/3进行快速调试。

        2
  •  4
  •   Christian    14 年前

    您看到的是,在生成它们的节点上,进程的组长设置为pid。看到了吗 erlang:group_leader . 组长是他们把成果送到的地方。

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

        3
  •  3
  •   Community Egal    7 年前

    看我的 answer 质疑 Erlang : RPC to a node with output on that node 对于一些细节如何实现输出到不同的地方。这一点并没有提到,您甚至可以在运行shell时运行远程shell。按一下 Ctrl+G ( ^G 在启动时提示)并且你有帮助 h Enter ).

    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>