2010-06-26 48 views
5

從另一個Erlang外殼訪問單個正在運行的mnesia節點以僅查看錶中的數據的最佳做法是什麼?在運行時從另一個Erlang外殼訪問Mnesia節點

我試着打開兩個shell並將它們指向同一個mnesia目錄位置,在文檔中找到它之後我意識到這是一個非常糟糕的主意。

-mnesia dir目錄。所有Mnesia數據存儲目錄的名稱。該目錄的名稱對於當前節點必須是唯一的。在任何情況下,兩個節點可能共享相同的Mnesia目錄。結果是完全不可預測的。

回答

1

我認爲最簡單的方法是加入遠程shell。剛開始erl-remsh Node參數

$ erl -sname foo 
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) 
([email protected])1> 

另一端:

$ erl -sname bar -remsh '[email protected]' 
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) 
([email protected])1> 

另一種選擇是使用erl(按^G

$ 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) 
([email protected])1> 
User switch command 
--> 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 
--> r '[email protected]' 
--> j 
    1 {shell,start,[init]} 
    2* {'[email protected]',shell,start,[]} 
--> c 
Eshell V5.7.5 (abort with ^G) 
([email protected])1> 
User switch command 
--> j 
    1 {shell,start,[init]} 
    2* {'[email protected]',shell,start,[]} 
--> c 1 

([email protected])1> 

注強大的作業控制功能,你必須按Enter如果您切換回現有shell,則顯示shell提示。

+0

從兩個Erlang應用程序訪問正在運行的Mnesia數據庫的最佳實踐是什麼?向Mnesia羣集添加節點並以這種方式訪問​​它似乎有點矯枉過正? – 2010-07-28 23:52:31

+0

@Peter:然後使用rpc模塊,如果它在同一個Erlang集羣中,或者當你想通過套接字進行通信時使用lib_chan。 – 2010-07-29 09:33:42

+1

我建議在使用遠程shell時使用-hidden標誌,特別是在處理分佈式網絡時。例如。 erl -sname bar -remsh'foo @ hynek-notebook'-hidden – 2010-09-19 09:21:13

相關問題