2015-08-22 15 views
5

काम नहीं करता है मेरे पास एक बहुत ही सरल इलीक्सिर कोड नमूना है जो मैं अलग-अलग नोड्स पर चलाना चाहता हूं।वितरित Elixir उदाहरण

पहला नोड मेरे लैपटॉप पर है, दूसरा एक रास्पबेरी पीआई है, जो एसएसएच के माध्यम से पहुंचा है।

कोड सरल है:

# [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 

मैं उम्मीद है कि Node.spawn_link रास्पबेरी Pi पर "hello world" मुद्रित होगा, लेकिन इसके बजाय यह दो अलग अलग iex उदाहरणों इस के साथ ** (EXIT from #PID<0.66.0>) no connect

एक ही मशीन पर यह कहते हुए एक त्रुटि से पता चलता कोड बस ठीक काम करता है।

मैं node1 पर iex --sname node1 --cookie secret और node2 पर iex --sname node2 --cookie secret के साथ आईईएक्स सत्र शुरू कर रहा हूं।

यह भी मेरी रास्पबेरी Pi iex पर यह देखते हुए कि लायक है इस चेतावनी के साथ शुरू होता:

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

आप अपने कंप्यूटर से 'कॉल कर रहे हैं नोड @ raspberry' (या उपाध्यक्ष से इसके विपरीत), आपको यह सुनिश्चित करने की ज़रूरत है कि आपने कहीं घोषित किया है कि मेजबान रास्पबेरी रास्पबेरी आईपी को इंगित करता है, अन्यथा रनटाइम को "रास्पबेरी" को कैसे ढूंढना नहीं है। हो सकता है कि अब आईपी का उपयोग करना एक आसान तरीका है: 'Node.spawn_link:" [email protected] ", ...'। जो भी जुड़ा हुआ है और क्या नहीं है, इसके बारे में अधिक जानकारी प्राप्त करने के लिए नोड में अन्य कार्यों का भी उपयोग करें। –

+0

मैंने रास्पबेरी ('1 9 2.168.1.103') के स्थानीय आईपी को 'रास्पबेरीपीआई' को इंगित करने के लिए'/etc/hosts' को बदल दिया। एलिक्सीर ने शिकायत की कि '[त्रुटि] ** सिस्टम पूरी तरह से योग्य होस्टनामों का उपयोग करने के लिए चल रहा है ** ** होस्टनाम रास्पबेरी अवैध है ** ' ठीक है, तो मैं गया और नाम आईपी के लिए बदल दिया:' Node.spawn_link: "[email protected] .1.103 ", एफएन -> हैलो.वर्ल्ड एंड 'और उसने मुझे बताया कि' ** शुरू नहीं हो सकता: erlang :: लागू करें, [# फ़ंक्शन <20.54118792/0 में: erl_eval.expr/5>, []] ([ : लिंक]) पर: "[email protected]" ** ' मुझे यकीन है कि मैं यहां कुछ वास्तव में सरल याद कर रहा हूं। – thepanuto

+0

ठीक है, मुझे मिल गया। यह आईपी चीज हर समय था, मैंने बस चीजों को खराब कर दिया। धन्यवाद, जोसे! – thepanuto

उत्तर

5

मैं आप उन्हें पाने के लिए नोड नाम में @ संकेत लगाने की जरूरत है अलग रूप में व्याख्या की जा करने के लिए लगता है नेटवर्क मशीनों

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

और फिर पहली आईईएक्स खोल में कनेक्ट नोड्स:

Node.connect :"[email protected]" 

कोलन सिंटैक्स पर ध्यान दें जो नोड नाम को इलीक्सिर परमाणु में बनाते हैं। @ साइन के कारण उद्धरणों की आवश्यकता है। आप पहले DNS नामों प्रयास करने से पहले कच्चे आईपी पते के साथ machinenames कोशिश कर सकते हैं, यदि आप समस्याओं कर रहे नायब: मैं नहीं बल्कि --name का उपयोग अपने --sname

+0

'नोड.कनेक्ट:" नोड @ machinename2 "' एक सुंदर 'झूठा' देता है। आईपी ​​के साथ भी कोशिश की। मैंने कहीं पढ़ा है कि एक फ़ाइल Erlang उपयोग करता है, जिसमें कुकीज़ के साथ कनेक्शन है। – thepanuto

+0

यह वास्तव में काम किया! बहुत बहुत धन्यवाद। – thepanuto

+0

आपकी टिप्पणियों के बीच क्या बदल गया? –