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

jkn*_*rkn 4 erlang rpc distributed spawn

我正在开发一个分散的Erlang应用程序.我目前正在使用单个PC并通过erl使用-sname标志初始化来创建多个节点.

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

当我通过spawn/4组合使用远程生成进程时register_name,输出io:format/2有时会重定向回到进行erl远程spawn/4调用的实例,有时仍然完全不可见.

类似地,当我使用时rpc:call/4,io:format/2调用的输出被重定向回到进行erl`rpc:call/4'调用的实例.

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

pro*_*ver 7

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

启动第一个节点,在全局注册本地shell进程组负责人:

erl -sname a
(a@localhost)1> global:register_name(global_io_srv, group_leader()).
yes
Run Code Online (Sandbox Code Playgroud)

启动第二个节点,连接,使用全局注册的进程作为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
Run Code Online (Sandbox Code Playgroud)

您将在第一个节点中看到测试输出.这与克里斯蒂安建议的方式相同,只是更明确一些.因此,您可以使用error_logger进行生产日志记录,使用io:format/3进行快速调试.