【发布时间】:2013-06-21 19:06:53
【问题描述】:
我首先在分离模式下启动 node_a,然后启动 node_b 控制台并使用 JCL(Ctrl+G) 连接到 node_a,然后我使用 application:start/1 启动应用程序。然后我看不到应用程序中的每个 io:format 输出。如何解决?
【问题讨论】:
标签: erlang erlang-otp
我首先在分离模式下启动 node_a,然后启动 node_b 控制台并使用 JCL(Ctrl+G) 连接到 node_a,然后我使用 application:start/1 启动应用程序。然后我看不到应用程序中的每个 io:format 输出。如何解决?
【问题讨论】:
标签: erlang erlang-otp
您可以为此使用 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() 的结果来执行此操作,但我没有验证它。
【讨论】:
不要使用io:format,而是使用lager 之类的日志记录解决方案并执行tail -f console.log 以查看更新到STDOUT 输出。如果我没记错的话,默认情况下,STDOUT 在分离节点上发送到/dev/null(如果您不使用像 lager 这样的日志记录解决方案)。
如果您想使用远程 shell 并查看直接输出,您可以使用io:fwrite(user,"the result is ~w\n",[X])。
【讨论】: