【问题标题】:Erlang how can I see application output via JCL on detached erl?Erlang如何在分离的erl上通过JCL查看应用程序输出?
【发布时间】:2013-06-21 19:06:53
【问题描述】:

我首先在分离模式下启动 node_a,然后启动 node_b 控制台并使用 JCL(Ctrl+G) 连接到 node_a,然后我使用 application:start/1 启动应用程序。然后我看不到应用程序中的每个 io:format 输出。如何解决?

【问题讨论】:

    标签: erlang erlang-otp


    【解决方案1】:

    您可以为此使用 erlang 函数 group_leader(Group_leader,Pid)。这里是一个小例子:

    我在一个控制台中运行该函数:

    ploop(I) ->
      io:format("mess num ~p, group_leader is ~p~n",[I,group_leader()]),
      receive
        stop -> io:format("bye bye~n"); 
        {group,P,F} ->
          group_leader(P,self()),
          F ! group_changed,
          ploop(0)
      after 5000 ->
        ploop(I+1)
      end.
    

    在连接到远程外壳后的第二个控制台中,我发送消息:

    PD ! {group,group_leader(),self()}.
    

    其中 PD 是进程 ploop 的 pid,仅此而已。但这必须为您想要捕获 io:format 的所有进程完成。您可以使用 processes() 的结果来执行此操作,但我没有验证它。

    【讨论】:

    • 这可能会,但在实践中不是一个好方法。我现在正在将我的日志写入文件。
    • 我个人使用 gen_event 并根据需要附加不同的记录器,具体取决于我正在寻找的内容(简单的控制台日志、ets、图形界面......),但我的回答有效并且符合您的要求:o) 顺便说一句,当你关闭远程控制台时,我没有检查间谍进程会发生什么。
    【解决方案2】:

    不要使用io:format,而是使用lager 之类的日志记录解决方案并执行tail -f console.log 以查看更新到STDOUT 输出。如果我没记错的话,默认情况下,STDOUT 在分离节点上发送到/dev/null(如果您不使用像 lager 这样的日志记录解决方案)。

    如果您想使用远程 shell 并查看直接输出,您可以使用io:fwrite(user,"the result is ~w\n",[X])

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2015-03-12
      • 2021-07-08
      • 2023-02-26
      • 2019-07-05
      • 1970-01-01
      相关资源
      最近更新 更多