2015-08-22 12 views
5

Ho un campione di codice Elixir molto semplice che voglio eseguire su nodi diversi.L'esempio di elisir distribuito non funziona

Il primo nodo è sul mio portatile, il secondo è un Raspberry Pi, accessibile tramite SSH.

Il codice è semplice:

# [email protected] 
defmodule Hello do 
    def world, do: IO.puts "hello world" 
end 

# [email protected] 
iex> Node.spawn_link :"[email protected]", fn -> Hello.world end 

Mi aspettavo che Node.spawn_link sarebbe stampare "hello world" sul Raspberry Pi, ma invece si vede un errore che dice ** (EXIT from #PID<0.66.0>) no connect

Sulla stessa macchina con due differenti iex casi questo il codice funziona bene.

Sto avviando la sessione IEx su node1 con iex --sname node1 --cookie secret e su node2 con iex --sname node2 --cookie secret.

E 'anche interessante notare che sul mio Raspberry Pi iex inizia con questo avvertimento:

warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell) Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)

+2

Se si chiama 'nodo @ raspberry' dal computer (o vice- versa), è necessario assicurarsi di aver dichiarato da qualche parte che il lampone host punta all'IP del lampone, altrimenti il ​​runtime non sa come trovare il "raspberry". Forse un modo più semplice per ora è usare gli IP: 'Node.spawn_link:" [email protected] ", ...'. Usa anche le altre funzioni nel nodo per trovare maggiori informazioni su cosa è connesso e cosa no. –

+0

Ho modificato '/ etc/hosts' per puntare' raspberrypi' sull'IP locale del lampone ('192.168.1.103'). Elixir si è lamentato che '[errore] ** Sistema in esecuzione per utilizzare nomi host completi ** ** Nome host raspberrypi è illegale **' Ok, quindi sono andato e ho cambiato i nomi in IP: 'Node.spawn_link:" [email protected] .1.103 ", fn -> Hello.world end' e mi ha detto che' ** Impossibile avviare: erlang :: apply, [# Function <20.54118792/0 in: erl_eval.expr/5>, []] ([ : link]) su: "[email protected]" ** ' Sono sicuro che mi manca qualcosa di veramente semplice qui. – thepanuto

+0

OK, ho capito. Era sempre la cosa dell'IP, ho solo rovinato tutto. Grazie, José! – thepanuto

risposta

5

penso che è necessario mettere il segno @ nel nodo-nomi per farli essere interpretato come separato macchine in rete

iex --name [email protected] --cookie mycookie 
iex --name [email protected] --cookie mycookie 

e quindi nel primo guscio iex connettere i nodi:

Node.connect :"[email protected]" 

Nota la sintassi del colon che rende il nome del nodo un atomo di elisir. Le virgolette sono necessarie a causa del segno @. Si potrebbe provare machinenames con gli indirizzi IP prime prima di cercare i nomi DNS, se si hanno problemi Nb: Io uso --name piuttosto che il vostro --sname

+0

'Node.connect:" node @ machinename2 "' restituisce un bellissimo 'false'. Ho provato anche con IP. Ho letto da qualche parte che esiste un file che Erlang utilizza, che ha una connessione con i cookie. – thepanuto

+0

Ha funzionato, in realtà! Molte grazie. – thepanuto

+0

Che cosa è cambiato tra i tuoi commenti? –

Problemi correlati