2010-06-26 34 views
5

Quelle est la meilleure pratique pour accéder à un seul nœud Mnesia en cours d'exécution à partir d'un autre shell Erlang pour afficher uniquement les données dans les tables?Accès à un nœud Mnesia depuis un autre shell Erlang pendant son exécution

J'ai essayé d'ouvrir deux shells et de les pointer vers le même emplacement de répertoire mnesia que j'ai réalisé était une très mauvaise idée après l'avoir trouvé dans la documentation.

-mnesia dir Répertoire. Le nom du répertoire où toutes les données Mnesia sont stockées. Le nom du répertoire doit être unique pour le nœud actuel. Deux nœuds ne peuvent en aucun cas partager le même répertoire Mnesia. Les résultats sont totalement imprévisibles.

Répondre

1

Je pense que la manière la plus simple est de se joindre à un shell distant. Il suffit de commencer erl avec -remsh Node paramètre

$ 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> 

Un autre terminal:

$ 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> 

Une autre option est d'utiliser puissante capacité de contrôle de l'emploi des erl (presse ^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> 

Notez que vous devez appuyer sur Enter pour afficher l'invite du shell si vous revenez à celui existant.

+0

Quelle serait la meilleure pratique pour accéder à une base de données Mnesia en cours à partir de deux applications Erlang? Ajouter un nœud au cluster Mnesia et y accéder de cette façon, semble un peu exagéré? –

+0

@Peter: Utilisez ensuite le module rpc s'il se trouve dans le même cluster Erlang ou utilisez lib_chan lorsque vous souhaitez communiquer via le socket. –

+1

Je recommande d'utiliser l'indicateur -hidden lorsque vous utilisez un shell distant, en particulier si vous traitez avec des réseaux distribués. Par exemple. erl -sname barre -remsh 'foo @ hynek-notebook' -hidden –