我正在开发一个分散的Erlang应用程序。我目前正在使用单个PC并通过使用erl
标志初始化-sname
来创建多个节点。
当我在其主节点上使用spawn/4
生成进程时,我可以在其主io:format/2
实例中看到该进程中调用erl
生成的输出。
当我使用spawn/4
与register_name
结合远程生成进程时,io:format/2
的输出有时会重定向回erl
实例,其中远程{{1}调用已经完成,有时仍然完全不可见。
同样,当我使用spawn/4
时,rpc:call/4
次调用的输出会重定向回io:format/2
实例,在该实例中会调用`rpc:call / 4'。
如何获得将调试输出发送回其父erl
实例的进程?
答案 0 :(得分:7)
您可以使用第一个节点的erlang:group_leader()结果在第二个节点上为io:format / 3提供第一个参数。
启动第一个节点,全局注册本地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_logger进行生产日志记录,使用io:format / 3进行快速调试。
答案 1 :(得分:4)
您所看到的是将其组长设置为他们所生成的节点上的pid的进程。见erlang:group_leader。小组长是他们将输出发送到的地方。
您将此输出称为“调试输出”,因此您确定不想在节点上启动sasl应用程序并使用error_logger吗?
答案 2 :(得分:3)
请参阅我的answer以询问Erlang : RPC to a node with output on that node有关如何实现输出到不同位置的一些详细信息。没有提到,即使在运行shell中也可以运行远程shell。只需按Ctrl+G
(启动时^G
提示),然后在h
下获得帮助(按h
而不是Enter
)。
示例:假设您已经erl -sname foo
运行了erlang节点。比:
$ 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>