Erlang: How to view output of io:format/2 calls in processes spawned on remote nodes

后端 未结 3 1310
天涯浪人
天涯浪人 2021-02-10 15:31

I am working on a decentralized Erlang application. I am currently working on a single PC and creating multiple nodes by initializing erl with the -sname

相关标签:
3条回答
  • 2021-02-10 16:06

    What you are seeing is processes with their group leader set to a pid on the node they were spawned from. See erlang:group_leader. The group leader is where they send their output to.

    You call this output "debugging output", so are you sure that you dont want to start the sasl application on the nodes and use error_logger?

    0 讨论(0)
  • 2021-02-10 16:12

    See mine answer to question Erlang : RPC to a node with output on that node for some details how to achieve output to different places. Which is not mentioned, you can run remote shell even in running shell. Just press Ctrl+G (^G hint on startup) and than you have help under h (press h and than Enter).

    Example: Assume you have running erlang node by erl -sname foo. Than:

    $ 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>
    
    0 讨论(0)
  • 2021-02-10 16:18

    You can supply 1st argument to io:format/3 on the second node, using result of erlang:group_leader() from the first node.

    Starting first node, registering local shell process group leader globally:

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

    Starting second node, connecting, using globally registered process as io device

    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
    

    You will see test output in the first node. This is the same way that Christian suggested, just a bit more explicit. So you can have error_logger for production logging and io:format/3 just for quick debugging.

    0 讨论(0)
提交回复
热议问题