erlang shell是使用者與 erlang 執行時系統互動的介面程式。事實上,erlang vm的執行不依賴任何shell,只要在啟動的時候新增引數detached就可以脫離終端。 -
detached
starts the erlang runtime system detached from the system console. useful for running daemons and backgrounds processes. implies -noinput.
實際上,detached等效於noshell 加上 noinput。
# erl -detached-emu_args
executing: /home/erl/lib/erlang/erts-5.10.3/bin/beam /home/erl/lib/erlang/erts-5.10.3/bin/beam -- -root /home/erl/lib/erlang -progname erl -- -home /root ---noshell -noinput
另外,需要注意的是,windows不直接支援detached,而是以服務的形式在後台執行,見
erlsrv
現在討論erlang 接入遠端shell控制台的幾種方式。
在 erlangshell 中按下^g鍵,就可以看到作業控制模式(jclmode)的選單。在選單中,有
個選項能讓我們連線到乙個遠端 shell。
先以detached執行乙個節點1:
# erl -name[email protected]-setcookie 123456 -detached
檢查這個erlang程序是否執行
# ps -ef | grep beam
root 20672 1 0 01:32 ? 00:00:00 /home/erl/lib/erlang/erts-5.10.3/bin/beam -- -root /home/erl/lib/erlang -progname erl -- -home /root -- -name
-setcookie 123456 -noshell -noinput
啟動另外乙個節點2,並接入到節點1
# erl -name[email protected]-setcookie 123456
erlang r16b02 (erts-5.10.3) [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
eshell v5.10.3 (abort with ^g)
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
2*
--> c 2
eshell v5.10.3 (abort with ^g)
注意了,windows下要使用werl
連線到遠端 shell 後,所有的終端輸入解析操作都由本地 shell 完成,不過求值的工作是在遠
程完成的。遠端求值的結果輸出全部被**給本地 shell。
要退出 shell, 按^g回到 jcl 模式。
終端輸入解析操作是在本地進行的, 因此通過^gq 的方式退出 shell
是安全的。
eshell v5.10.3 (abort with ^g) (
user switch command
--> q
remsh和 jcl 模式很類似,但是呼叫方式不同的機制。使用這種機制,jcl 模式的所有
操作步驟都可以被繞過,只需像下面這樣啟動 shell,對於長名字:
-remshnode
starts erlang with a remote shell connected to node.
以下方式啟動節點2,將直接接入節點1控制台:
# erl -name[email protected]-setcookie 123456-remsh[email protected]
erlang r16b02 (erts-5.10.3) [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
eshell v5.10.3 (abort with ^g)
([email protected])1> node().
這種方式和jcl很相像,本地也會啟動乙個erlang節點用於接入遠端shell
erlang自帶了
ssh的功能,我們可以很方便的開啟ssh服務
,對外提供遠端 shell服務。 ssh的使用需要開啟crypto,如果erlang顯示以下錯誤,可以參考這篇文章。
1> crypto:start().
** exception error: undefined function crypto:start/0
要使用該功能,通常需要先準備好具有遠端訪問 ssh 許可權的 key,不過這裡為了快速
測試,可以這樣做:
節點1啟動ssh服務:
eshell v5.10.3 (abort with ^g)
([email protected])1> ssh:start().
ok
([email protected])2> ssh:daemon(8888, ).
本地不需要啟動erlang節點,直接使用ssh連線即可,輸入以上設定的密碼,就可以接入節點1的shell控制台。
# ssh -p 8888[email protected]
the authenticity of host '[127.0.0.1]:8888 ([127.0.0.1]:8888)' can't be established.
rsa key fingerprint is ad:03:b4:6b:df:51:97:23:dc:47:cb:75:85:15:44:89.
are you sure you want to continue connecting (yes/no)?
yes
warning: permanently added '[127.0.0.1]:8888' (rsa) to the list of known hosts.
[email protected]'s password:
eshell v5.10.3 (abort with ^g)
這種方式,erlang
shell所有操作都是在遠端節點完成的。
在使用管道(pipe)連線到乙個erlang節點時,和ssh一樣不需要啟動本地erlang節點
。這種方法很少用,每次輸出時都呼叫fsync,如果輸出過多時,會有很大的效能損失。
具體做法為:用run_erl啟動 erlang,相當於把 erlang 程序包在乙個
管道中:
# mkdir /tmp/erl_log
# cd /home/erl/bin
# ./run_erl -daemon /tmp/erl_pipe /tmp/erl_log "erl -name[email protected]-setcookie 123456"
其中,daemon 表示以後臺程序執行,/tmp/erl_pipe是管道檔案的名稱,/tmp/erl_log指定了日誌儲存資料夾
然後使用 to_erl 程式來連線節點:
# ./to_erl /tmp/erl_pipe
attaching to /tmp/erl_pipe (^d to exit)
([email protected])1> node(). '
參考:
erlang接入遠端shell
兩種方式 erl name aaa 127.0.0.1 setcookie 111 erl name bbb 127.0.0.1 setcookie 111 ctrl g進入jcl模式 h檢視幫助r aaa 127.0.0.1 j檢視job列表 c 2進入遠端shell 如果返回,則重新ctrl g...
erlang遠端呼叫示例
下面的例子試用了erlang的分布式程式設計,從中可以看出像erlang這種基於訊息的純函式語言在分布式程式設計中的強大威力.在遠端節點編寫乙個測試的模組 module distribution export a 0 a hello.首先啟動遠端節點,並設定cookie,載入模組 erl name ...
遠端接入 原始碼
通過終端服務,可以很容易的用c delphi c pb 等開發工具,開發出自己的遠端接入系統。類似瑞友天翼等遠端接入軟體的效果 呼叫說明 下面截圖說明利用此遠端接入元件開發的b s結構的遠端接入系統 輸入遠端伺服器分配的賬號,登入系統 支援域賬號登入 顯示遠端伺服器已發布的應用程式清單 開啟遠端應用...