4

私は分散型の Erlang アプリケーションに取り組んでいます。erl現在、1台のPCで作業しており、-snameフラグで初期化して複数のノードを作成しています。

spawn/4ホーム ノードを使用してプロセスを生成すると、ホームインスタンスio:format/2でそのプロセス内の呼び出しによって生成された出力が表示されます。erl

spawn/4と組み合わせて使用​​してリモートでプロセスを生成するとregister_name、 の出力が、リモート呼び出しが行われたインスタンスにio:format/2リダイレクトされることがあり、完全に見えないままになることがあります。erlspawn/4

同様に、私が を使用すると、呼び出しrpc:call/4の出力は、`rpc:call/4' 呼び出しが行われio:format/2たインスタンスにリダイレクトされます。erl

プロセスがデバッグ出力を親erlインスタンスに戻すにはどうすればよいですか?

4

3 に答える 3

7

最初のノードからの erlang:group_leader() の結果を使用して、2 番目のノードの io:format/3 に 1 番目の引数を指定できます。

最初のノードを開始し、ローカル シェル プロセス グループ リーダーをグローバルに登録します。

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

2 番目のノードの起動、接続、グローバルに登録されたプロセスを 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 を使用できます。

于 2010-04-06T20:02:20.397 に答える
4

表示されているのは、グループ リーダーが生成元のノードの pid に設定されているプロセスです。erlang:group_leaderを参照してください。グループ リーダーは、出力の送信先です。

この出力を「デバッグ出力」と呼んでいるので、ノードで sasl アプリケーションを起動してerror_loggerを使用したくないのですか?

于 2010-04-06T19:20:31.770 に答える
3

さまざまな場所への出力を実現する方法の詳細については、質問Erlang:そのノードに出力があるノードへのRPCに対する私の回答を参照してください。言及されていませんが、シェルを実行している場合でもリモートシェルを実行できます。(起動時のヒント)を押すだけで、( and thanを押して)ヘルプが表示されます。Ctrl+G^GhhEnter

例:によってerlangノードを実行していると仮定しますerl -sname foo。よりも:

$ 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>
于 2010-04-07T06:41:41.390 に答える