2010-05-07 29 views
4

J'ai implémenté un serveur de génération et un superviseur: test_server et test_sup. Je veux les tester depuis le shell/CLI. J'ai écrit leurs fonctions start_link de sorte que leurs noms sont enregistrés localement.Impossible de générer un superviseur erlang à partir du shell

J'ai trouvé que je peux générer le test_server à partir de la ligne de commande très bien, mais un test_sup engendré ne me permet pas d'interagir avec le serveur du tout.

Par exemple, je peux frayer un test_server en exécutant:

1> spawn(test_server, start_link, []). 
<0.39.0> 
2> registered(). 
[...,test_server,...] 

je peux interagir avec le serveur, et tout semble bien.

Cependant, si j'essaie de faire la même chose avec test_sup, aucun nouveau nom/PID n'est enregistré dans mon "processus CLI" (en utilisant registered/0). Mon test_server semble avoir été engendré, mais je ne peux pas interagir avec lui (voir le commentaire de Lukas Larsson sur SASL pour voir pourquoi c'est vrai).

Je suppose que je codé une erreur dans mon superviseur, mais cette méthode de commencer mon superviseur fonctionne parfaitement bien:

1> {ok, Pid}= test_sup:start_link([]). 
{ok, <0.39.0>} 
2> unlink(Pid). 
true 
3> registered(). 
[...,test_server,test_sup,...] 

Pourquoi est-ce que je peux frayer un gen_server mais pas un superviseur?


Mise à jour

Le code que je utilise peut être trouvé dans this post. J'utilise echo_server et echo_sup, deux modules très simples.

Étant donné que le code, cela fonctionne:

spawn(echo_server, start_link, []). 

et cela ne:

spawn(echo_sup, start_link, []). 
+1

Pouvez-vous coller votre code quelque part? –

Répondre

1

Cette explication a été donnée par Bernard Duggan sur le Erlang questions mailing list:

processus liés ne meurent pas automatiquement quand un processus ils sont liés à sorties avec le code « normal ». C'est pourquoi [echo_server] ne se ferme pas lorsque le processus de génération se termine. Alors, pourquoi le superviseur meurt-il? Les internes de le module de superviseur sont en fait eux-mêmes implémentés en tant que gen_server, mais avec process_flag (trap_exit, true) ensemble. Le résultat de ceci est que lorsque le processus parent meurt, terminate() reçoit appelé (ce qui ne se produit pas lorsque trap_exit est désactivé) et le superviseur s'arrête. Il est logique dans le contexte d'un superviseur, depuis un superviseur a donné naissance par son parent dans un arbre de surveillance - si elle n'a pas meurent chaque fois que son arrêt parent, quelle que soit la raison, vous auriez ballants " branches "de l'arbre.

3

Chaque fois que d'essayer de comprendre ces choses, il est généralement très utile pour activer SASL.

application: démarrer (sasl).

De cette façon, vous devriez apprendre à savoir pourquoi votre superviseur se termine.

+0

Il ne semble pas se terminer. Après avoir démarré SASL, j'obtiens un rapport de progression indiquant que echo_sup et echo_server ont été démarrés, mais que le serveur echo n'est plus accessible depuis la ligne de commande. – drfloob

+0

Je devrais voir votre code de superviseur et votre serveur de gen pour vous aider davantage. Il y a probablement quelque chose de petit qui vous manque. – Lukas

+0

J'ai lié au code dans la mise à jour # 1. [Voici le lien à nouveau] (http://stackoverflow.com/questions/2775114/erlang-otp-supervisor-crashing) – drfloob