Доступ к узлу Mnesia из другой оболочки Erlang во время его работы

Как лучше всего получить доступ к одному работающему узлу mnesia из другой оболочки Erlang, чтобы просматривать только данные в таблицах?

Я попытался открыть две оболочки и указать их на одно и то же расположение каталога mnesia, что, как я понял, было очень плохой идеей после того, как нашел это в документации.

-mnesia dir Справочник. Имя каталога, в котором хранятся все данные Mnesia. Имя каталога должно быть уникальным для текущего узла. Два узла ни при каких обстоятельствах не могут использовать один и тот же каталог Mnesia. Результаты совершенно непредсказуемы.


person Peter Holko    schedule 26.06.2010    source источник


Ответы (1)


Я думаю, что самый простой способ - присоединиться к удаленной оболочке. Просто запустите 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)
(foo@hynek-notebook)1> 

Другой терминал:

$ erl -sname bar -remsh 'foo@hynek-notebook'
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)
(foo@hynek-notebook)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)
(bar@hynek-notebook)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 'foo@hynek-notebook'
 --> j
   1  {shell,start,[init]}
   2* {'foo@hynek-notebook',shell,start,[]}
 --> c 
Eshell V5.7.5  (abort with ^G)
(foo@hynek-notebook)1> 
User switch command
 --> j
   1  {shell,start,[init]}
   2* {'foo@hynek-notebook',shell,start,[]}
 --> c 1

(bar@hynek-notebook)1>

Обратите внимание, что вам нужно нажать Enter, чтобы отобразить приглашение оболочки, если вы переключаетесь обратно на существующую.

person Hynek -Pichi- Vychodil    schedule 26.06.2010
comment
Как лучше всего получить доступ к работающей базе данных Mnesia из двух приложений Erlang? Добавить узел в кластер Mnesia и получить к нему доступ таким образом, кажется немного излишним? - person Peter Holko; 29.07.2010
comment
@Peter: Затем используйте модуль rpc, если он находится в том же кластере Erlang, или используйте lib_chan, если вы хотите общаться через сокет. - person Hynek -Pichi- Vychodil; 29.07.2010
comment
Я рекомендую использовать флаг -hidden при использовании удаленной оболочки, особенно если вы имеете дело с распределенными сетями. Например. erl -sname bar -remsh 'foo @ hynek-notebook' -hidden - person Mazen Harake; 19.09.2010